4 votes

Visualiser une caméra usb raw10 bit en utilisant OpenCV python

J'essaie de visualiser la sortie d'un système Omnivision. OV7251 caméra en OpenCV 4.2.0 Python 3.5.6. La sortie de la caméra est constituée de données brutes en niveaux de gris de 10 bits, qui, je crois, sont alignées à droite dans des mots de 16 bits.

Quand j'utilise ce code 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

Voici l'image que j'obtiens :

OpenCV raw 10-bit OV7251

On peut supposer que ce qui se passe, c'est qu'OpenCV utilise le mauvais processus pour convertir le brut 10 bits en RVB, croyant qu'il s'agit d'une sorte de YUV ou autre.

Y a-t-il un moyen pour que je puisse soit :

  • Indiquer à OpenCV le format de données correct de la caméra pour qu'il effectue la conversion correctement ?
  • Obtenir les données brutes de la caméra afin de pouvoir effectuer la conversion manuellement ?

6voto

Rocketmagnet Points 1660

Une façon d'y parvenir est de saisir les données brutes de la caméra, puis d'utiliser numpy pour les corriger :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X