使用OpenCV python查看10位usb摄像头

使用OpenCV python查看10位usb摄像头,python,opencv,camera,computer-vision,color-space,Python,Opencv,Camera,Computer Vision,Color Space,我试图在OpenCV 4.2.0 Python 3.5.6中查看Omnivision相机的输出。相机的输出是10位原始灰度数据,我相信这是正确的16位字对齐 当我使用此OpenCV代码时: import cv2 cam2 = cv2.VideoCapture(0) cam2.set(3, 640) # horizontal pixels cam2.set(4, 480) # vertical pixels while True: b, fr

我试图在OpenCV 4.2.0 Python 3.5.6中查看Omnivision相机的输出。相机的输出是10位原始灰度数据,我相信这是正确的16位字对齐

当我使用此OpenCV代码时:

import cv2

cam2 = cv2.VideoCapture(0)
cam2.set(3, 640)            # horizontal pixels
cam2.set(4, 480)            # vertical pixels

while True:
    b, frame = cam2.read()

    if b:
        cv2.imshow("Video", frame)

        k = cv2.waitKey(5)

        if k & 0xFF == 27:
            cam2.release()
            cv2.destroyAllWindows()
            break
这是我得到的图像:

大概是OpenCV使用了错误的过程将10位原始数据转换为RGB,认为它是某种YUV或其他东西

有什么方法可以让我:

  • 告诉OpenCV相机的正确数据格式,以便正确进行转换
  • 获取原始相机数据,以便我可以手动进行转换

一种方法是获取原始摄像机数据,然后使用numpy进行校正:

import cv2
import numpy as np

cam2 = cv2.VideoCapture(0)
cam2.set(3, 640)            # horizontal pixels
cam2.set(4, 480)            # vertical pixels

cam2.set(cv2.CAP_PROP_CONVERT_RGB, False);          # Request raw camera data

while True:
    b, frame = cam2.read()

    if b:
        frame_16 = frame.view(dtype=np.int16)       # reinterpret data as 16-bit pixels
        frame_sh = np.right_shift(frame_16, 2)      # Shift away the bottom 2 bits
        frame_8  = frame_sh.astype(np.uint8)        # Keep the top 8 bits       
        img      = frame_8.reshape(480, 640)        # Arrange them into a rectangle

        cv2.imshow("Video", img)

        k = cv2.waitKey(5)

        if k & 0xFF == 27:
            cam2.release()
            cv2.destroyAllWindows()
            break

视频还是照片?文档明确地说“原始”?(不是“日志”之类的东西)?因为photo RAW是一种未经校正的RGB,但得到的G是原来的两倍,而且滤光片的色度(以及每个滤光片的强度)与sRGB不同。视频通常有未修正(或线性)的空间,通常为10位,但它并不是一个真正的原始(所以YCC)。您应该尝试使用一种模式(黑色、白色和少量灰色+全饱和颜色的波段),以获得有关颜色编码的更多信息。