opencv 如何使用Python访问笔记本电脑的内置红外网络摄像头?

m1m5dgzv  于 2023-11-22  发布在  Python
关注(0)|答案(3)|浏览(182)

我试图在Python项目中访问我笔记本电脑的内置红外摄像头(用于windows hello)。我可以使用OpenCV中的VideoCapture类轻松访问正常的RGB摄像头,但无法找到访问红外摄像头的方法。我尝试向VideoCapture类传递不同的索引,但只有“0”起作用,这是正常的摄像头。
有一些方法可以使用Windows API来实现这一点,但是我找不到在Python中访问它的方法。
有些人已经能够在Ubuntu上使用fswebcam访问windows hello相机。
有没有办法使用python访问红外摄像机?也许有一些方法可以使用pywin32与Windows API接口?任何帮助都可以开始使用。或者,有没有类似于Windows的fswebcam的东西可以让我做同样的事情?

6tqwzwtp

6tqwzwtp1#

您提供的示例似乎没有使用win32 API,而是使用了dotnet框架,特别是Windows.Media.Capture.Frames.MediaFrameSourceGroup类。
看起来你可以使用http://pythonnet.github.io/来访问dotnet框架,之后就可以将C#代码移植到Python了。

7ajki6be

7ajki6be2#

我有点晚了,但也许我可以帮助别人。你可以通过WinRT访问红外摄像头。如果你想用Python来做,应该使用一个维护的WinRT替代品winsdk
我遵循了这个教程:Process media frames with MediaFrameReader
我跳过并简化了一些代码部分,但它确实完成了这项工作。捕获的帧显示在OpenCV窗口中。您可以按“q”退出。
你必须注意脚本中的两个常量。camera_image_widthcamera_image_height定义了捕获帧的分辨率。对于我的硬件,它们是640和360。我不知道这是否是预览相机的标准分辨率,它们可能与其他硬件不同。你可以通过在第88行后调用software_bitmap.pixel_heightsoftware_bitmap.pixel_height来确定它们。
必须安装以下Python包:

  • asyncio
  • numpy
  • OpenCV-Python
  • winsdk

以下是整个脚本:

  1. import asyncio
  2. import time
  3. import numpy as np
  4. import cv2
  5. from winsdk.windows.media.capture import MediaStreamType
  6. from winsdk.windows.media.capture import MediaCapture
  7. from winsdk.windows.media.capture import MediaCaptureInitializationSettings
  8. from winsdk.windows.media.capture import MediaCaptureSharingMode
  9. from winsdk.windows.media.capture import MediaCaptureMemoryPreference
  10. from winsdk.windows.media.capture import StreamingCaptureMode
  11. from winsdk.windows.media.capture.frames import MediaFrameSourceGroup
  12. from winsdk.windows.media.capture.frames import MediaFrameSourceInfo
  13. from winsdk.windows.media.capture.frames import MediaFrameSourceKind
  14. from winsdk.windows.media.capture.frames import MediaFrameReader
  15. from winsdk.windows.graphics.imaging import SoftwareBitmap
  16. from winsdk.windows.graphics.imaging import BitmapPixelFormat
  17. from winsdk.windows.storage.streams import Buffer
  18. camera_image_width = 640
  19. camera_image_height = 360
  20. async def main():
  21. ##### Find the first infra source group #####
  22. media_frame_source_groups = await MediaFrameSourceGroup.find_all_async()
  23. infra_source_group: MediaFrameSourceGroup
  24. infra_source_info: MediaFrameSourceInfo
  25. # Iterating through source groups
  26. for source_group in media_frame_source_groups:
  27. for source_info in source_group.source_infos:
  28. if source_info.media_stream_type == MediaStreamType.VIDEO_PREVIEW and source_info.source_kind == MediaFrameSourceKind.INFRARED:
  29. infra_source_group = source_group
  30. infra_source_info = source_info
  31. # Check if there's available infra source
  32. if infra_source_group is None or infra_source_info is None:
  33. print("No infra source was found!")
  34. return
  35. ##### Getting frames from infra camera #####
  36. with MediaCapture() as media_capture:
  37. # Settings for MediaCapture object
  38. media_capture_settings = MediaCaptureInitializationSettings()
  39. media_capture_settings.source_group = infra_source_group
  40. media_capture_settings.sharing_mode = MediaCaptureSharingMode.EXCLUSIVE_CONTROL
  41. media_capture_settings.memory_preference = MediaCaptureMemoryPreference.CPU
  42. media_capture_settings.streaming_capture_mode = StreamingCaptureMode.VIDEO
  43. await media_capture.initialize_async(media_capture_settings)
  44. # Init frame reader
  45. media_frame_reader: MediaFrameReader = await media_capture.create_frame_reader_async(media_capture.frame_sources[infra_source_info.id])
  46. await media_frame_reader.start_async()
  47. # Each frame must be dumped into a buffer
  48. frame_buffer = Buffer(camera_image_width * camera_image_height * 4)
  49. # Wait for frames
  50. while True:
  51. # Capturing with 20fps
  52. time.sleep(0.05)
  53. # Get the latest available frame
  54. media_frame_reference = media_frame_reader.try_acquire_latest_frame()
  55. # If the frame is null, skip this cycle
  56. if media_frame_reference is None:
  57. continue
  58. # Try to read frame
  59. with media_frame_reference:
  60. # Boilerplate bullshit to extract bitmap data
  61. video_media_frame = media_frame_reference.video_media_frame
  62. if video_media_frame is None:
  63. return
  64. software_bitmap = video_media_frame.software_bitmap
  65. if software_bitmap is None:
  66. return
  67. ##### The bitmap is just fine #####
  68. with software_bitmap:
  69. # Convert image format
  70. grayscale_bitmap = SoftwareBitmap.convert(software_bitmap, BitmapPixelFormat.RGBA8)
  71. # Dump image data to byte buffer
  72. grayscale_bitmap.copy_to_buffer(frame_buffer)
  73. # Create actual OpenCV image from byte buffer
  74. image_array = np.frombuffer(frame_buffer, dtype=np.uint8).reshape(camera_image_height, camera_image_width, 4)
  75. # If the image is all black, skip showing
  76. if cv2.countNonZero(cv2.cvtColor(image_array, cv2.COLOR_RGBA2GRAY)) == 0:
  77. continue
  78. cv2.imshow('Infrared camera', image_array)
  79. if cv2.waitKey(1) == ord('q'):
  80. break
  81. cv2.destroyAllWindows()
  82. asyncio.run(main())

字符串
祝你好运!

展开查看全部
t30tvxxf

t30tvxxf3#

您需要访问WinRT API,而不是Win32 API。
使用这个库:https://github.com/Microsoft/xlang/tree/master/src/package/pywinrt/projection,你应该能够从你发布的代码中调用WinRT中必要的部分。

相关问题