Просмотр сырой 10-битной USB-камеры с использованием OpenCV python - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь просмотреть вывод камеры Omnivision OV7251 в OpenCV 4.2.0 Python 3.5.6. Вывод с камеры - это 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 raw 10-bit OV7251

Предположительно, происходит то, что OpenCV использует неправильный процесс для преобразования из 10-битного raw в RGB, полагая, что это своего рода YUV или что-то в этом роде.

Есть ли способ, которым я могу либо:

  • Сказать OpenCV правильный формат данных камеры, чтобы она правильно выполняла преобразование?
  • Получить необработанных данных камеры, чтобы я мог выполнить преобразование вручную?

1 Ответ

1 голос
/ 07 февраля 2020

Один из способов сделать это - получить необработанные данные с камеры, а затем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...