How to switch camera to YUY2 format in opencv

3.1k Views Asked by At

I'm trying to get my camera to capture video using the YUY2 format instead of the MJPEG format that it currently uses. How can I do this in OpenCV?

So I've looked into the fourcc codes that are provided in OpenCV and I've tried camera.set(cv2.CAP_PROP_FOURCC,844715353.0). That number is the code for YUY2. However, whenever I run the program it always results back to a NV12 format. I tried using VideoWriter too and the same issue still came up. It never switches.

    import cv2
    import sys
    import numpy as np
    import time

    fourcc_names = ['CAP_PROP_POS_MSEC', 'CAP_PROP_POS_FRAMES',        'CAP_PROP_POS_AVI_RATIO', 'CAP_PROP_FRAME_WIDTH', 'CAP_PROP_FRAME_HEIGHT', 'CAP_PROP_FPS', 'CAP_PROP_FOURCC', 'CAP_PROP_FRAME_COUNT', 'CAP_PROP_FORMAT', 'CAP_PROP_MODE', 'CAP_PROP_BRIGHTNESS', 'CAP_PROP_CONTRAST', 'CAP_PROP_SATURATION', 'CAP_PROP_HUE', 'CAP_PROP_GAIN', 'CAP_PROP_EXPOSURE', 'CAP_PROP_CONVERT_RGB', 'CAP_PROP_WHITE_BALANCE_BLUE_U', 'CAP_PROP_RECTIFICATION', 'CAP_PROP_MONOCHROME', 'CAP_PROP_SHARPNESS', 'CAP_PROP_AUTO_EXPOSURE', 'CAP_PROP_GAMMA', 'CAP_PROP_TEMPERATURE', 'CAP_PROP_TRIGGER', 'CAP_PROP_TRIGGER_DELAY', 'CAP_PROP_WHITE_BALANCE_RED_V', 'CAP_PROP_ZOOM', 'CAP_PROP_FOCUS', 'CAP_PROP_GUID', 'CAP_PROP_ISO_SPEED', 'CAP_PROP_BACKLIGHT', 'CAP_PROP_PAN', 'CAP_PROP_TILT', 'CAP_PROP_ROLL', 'CAP_PROP_IRIS', 'CAP_PROP_SETTINGS', 'CAP_PROP_BUFFERSIZE', 'CAP_PROP_AUTOFOCUS']
def decode_fourcc(v):
  v = int(v)
  return "".join([chr((v >> 8 * i) & 0xFF) for i in range(4)])

print(cv2.__version__)

camera = cv2.VideoCapture()
camera.set(cv2.CAP_PROP_FOURCC,844715353.0)


#codec = 844715353.0 # YUY2

# print 'fourcc:', decode_fourcc(codec)
fourcc = cv2.VideoWriter_fourcc(*'YUY2')
#camera.set(cv2.CAP_PROP_FOURCC, codec)
camera.open(1)

#print Camera open:', camera.isOpened()
# print camera.get(cv2.CAP_PROP_FOURCC)
# C = camera.get(cv2.CAP_PROP_FOURCC)
# print 'fourcc original:', decode_fourcc(C)
# codec = 0x47504A4D # MJPG
# codec = 844715353.0 # YUY2



camera.set(cv2.CAP_PROP_FRAME_WIDTH, 3264)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 2448)
camera.set(cv2.CAP_PROP_FPS, 15.0)

print(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
print (camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
print (camera.get(cv2.CAP_PROP_FPS))
C = camera.get(cv2.CAP_PROP_FOURCC)
print('fourcc:', decode_fourcc(C))

print
for i in range(38):
    print(i, fourcc_names[i], camera.get(i))

while(1):

    camera.grab()
    retval, im = camera.retrieve(0)
    cv2.imshow("image", im)
    k = cv2.waitKey(1) & 0xff
    if k == 27:
        break

camera.release()
cv2.destroyAllWindows()

This is the output of the code. As you can see the fourcc stays NV12 and doesn't switch when I set it. How do I get it to listen?

4.1.0
3264.0
2448.0
15.0
fourcc: NV12
0 CAP_PROP_POS_MSEC 0.0
1 CAP_PROP_POS_FRAMES 0.0
2 CAP_PROP_POS_AVI_RATIO -1.0
3 CAP_PROP_FRAME_WIDTH 3264.0
4 CAP_PROP_FRAME_HEIGHT 2448.0
5 CAP_PROP_FPS 15.0
6 CAP_PROP_FOURCC 842094158.0
7 CAP_PROP_FRAME_COUNT -1.0
8 CAP_PROP_FORMAT -1.0
9 CAP_PROP_MODE 0.0
10 CAP_PROP_BRIGHTNESS 0.0
11 CAP_PROP_CONTRAST 32.0
12 CAP_PROP_SATURATION 105.0
13 CAP_PROP_HUE 0.0
14 CAP_PROP_GAIN 0.0
15 CAP_PROP_EXPOSURE -7.0
16 CAP_PROP_CONVERT_RGB 1.0
17 CAP_PROP_WHITE_BALANCE_BLUE_U -1.0
18 CAP_PROP_RECTIFICATION -1.0
19 CAP_PROP_MONOCHROME -1.0
20 CAP_PROP_SHARPNESS 3.0
21 CAP_PROP_AUTO_EXPOSURE 1.0
22 CAP_PROP_GAMMA 100.0
23 CAP_PROP_TEMPERATURE 4600.0
24 CAP_PROP_TRIGGER -1.0
25 CAP_PROP_TRIGGER_DELAY -1.0
26 CAP_PROP_WHITE_BALANCE_RED_V -1.0
27 CAP_PROP_ZOOM -1.0
28 CAP_PROP_FOCUS -1.0
29 CAP_PROP_GUID -1.0
30 CAP_PROP_ISO_SPEED -1.0
31 CAP_PROP_BACKLIGHT -1.0
32 CAP_PROP_PAN 1.0
33 CAP_PROP_TILT -1.0
34 CAP_PROP_ROLL -1.0
35 CAP_PROP_IRIS -1.0
36 CAP_PROP_SETTINGS -1.0
37 CAP_PROP_BUFFERSIZE -1.0
0

There are 0 best solutions below