Robobot camera
From Rsewiki
(Difference between revisions)
(→Raspberry Pi OS) |
(→camera settings) |
||
Line 2: | Line 2: | ||
== camera settings == | == camera settings == | ||
− | |||
− | |||
− | + | === Data formats === | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
The used camera is a 'Jieli Technology' camera of type 'USB PHY 2.0' (packed by Sandberg). | The used camera is a 'Jieli Technology' camera of type 'USB PHY 2.0' (packed by Sandberg). | ||
Line 40: | Line 15: | ||
It also supports "raw" format as YUYV 4:2:2, but it seems like data loss occurs (fragmented images), so do not use this format. | It also supports "raw" format as YUYV 4:2:2, but it seems like data loss occurs (fragmented images), so do not use this format. | ||
+ | |||
+ | === Use from OpenCV (C++) === | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | int deviceID = dev; // 0 = open default camera | ||
+ | int apiID = cv::CAP_V4L2; //cv::CAP_ANY; // 0 = autodetect default API | ||
+ | // open selected camera using selected API | ||
+ | cap.open(deviceID, apiID); | ||
+ | // check if we succeeded | ||
+ | camIsOpen = cap.isOpened(); | ||
+ | if (not camIsOpen) | ||
+ | { | ||
+ | cerr << "ERROR! Unable to open camera\n"; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | uint32_t fourcc = cv::VideoWriter::fourcc('M','J','P','G'); | ||
+ | cap.set(cv::CAP_PROP_FOURCC, fourcc); | ||
+ | // possible resolutions in JPEG coding | ||
+ | // (rows x columns) 320x640, 720x1280 | ||
+ | cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720); | ||
+ | cap.set(cv::CAP_PROP_FRAME_WIDTH, 1280); | ||
+ | cap.set(cv::CAP_PROP_FPS, 25); | ||
+ | // now the camera is ready for frame capture. | ||
+ | // debug print of accepted format: | ||
+ | union FourChar | ||
+ | { // the four characters are coded into a 32 bit integer. | ||
+ | uint32_t cc4; | ||
+ | char ccc[4]; | ||
+ | } fmt; | ||
+ | fmt.cc4 = cap.get(cv::CAP_PROP_FOURCC); // get format | ||
+ | printf("# Video device %d: width=%g, height=%g, format=%c%c%c%c, FPS=%g\n", | ||
+ | dev, | ||
+ | cap.get(cv::CAP_PROP_FRAME_WIDTH), | ||
+ | cap.get(cv::CAP_PROP_FRAME_HEIGHT), | ||
+ | fmt.ccc[0], fmt.ccc[1], fmt.ccc[2], fmt.ccc[3], | ||
+ | cap.get(cv::CAP_PROP_FPS)); | ||
+ | } |
Revision as of 12:13, 6 December 2022
Back to Robobot
camera settings
Data formats
The used camera is a 'Jieli Technology' camera of type 'USB PHY 2.0' (packed by Sandberg).
The camera has limited control capabilities but supports the following data formats.
- MJPG coded 640 x 320 pixels at 25 or 30 FPS
- MJPG coded 1280 x 720 pixels at 25 or 30 FPS
- MJPG coded 1920 x 1080 pixels at 25 or 30 FPS
- MJPG coded 640 x 480 pixels at 25 or 30 FPS, cuts parts of the image to fit the format
It also supports "raw" format as YUYV 4:2:2, but it seems like data loss occurs (fragmented images), so do not use this format.
Use from OpenCV (C++)
void setup() {
int deviceID = dev; // 0 = open default camera int apiID = cv::CAP_V4L2; //cv::CAP_ANY; // 0 = autodetect default API // open selected camera using selected API cap.open(deviceID, apiID); // check if we succeeded camIsOpen = cap.isOpened(); if (not camIsOpen) { cerr << "ERROR! Unable to open camera\n"; } else { uint32_t fourcc = cv::VideoWriter::fourcc('M','J','P','G'); cap.set(cv::CAP_PROP_FOURCC, fourcc); // possible resolutions in JPEG coding // (rows x columns) 320x640, 720x1280 cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720); cap.set(cv::CAP_PROP_FRAME_WIDTH, 1280); cap.set(cv::CAP_PROP_FPS, 25); // now the camera is ready for frame capture. // debug print of accepted format: union FourChar { // the four characters are coded into a 32 bit integer. uint32_t cc4; char ccc[4]; } fmt; fmt.cc4 = cap.get(cv::CAP_PROP_FOURCC); // get format printf("# Video device %d: width=%g, height=%g, format=%c%c%c%c, FPS=%g\n", dev, cap.get(cv::CAP_PROP_FRAME_WIDTH), cap.get(cv::CAP_PROP_FRAME_HEIGHT), fmt.ccc[0], fmt.ccc[1], fmt.ccc[2], fmt.ccc[3], cap.get(cv::CAP_PROP_FPS)); }