Robobot camera: Difference between revisions

From Rsewiki
Line 2: Line 2:


== camera settings ==
== camera settings ==
<!--
=== On Raspberry PI Debian OS. ===


The used camera has limited possibilities.
=== Data formats ===
 
640 x 480 at 25 FPS using MJPG coding seems like a working resolution.
 
All higher resolutions seem to crash the camera driver, requiring a reboot.
 
BUT, after a few, sometimes, successful captures, things go wrong, and 'sudo dmesg' shows something like:
 
[  237.889889] usb 1-1.5: new high-speed USB device number 6 using dwc2
[  237.991458] usb 1-1.5: New USB device found, idVendor=1224, idProduct=2a25, bcdDevice= 1.00
[  237.991505] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  237.991524] usb 1-1.5: Product: USB PHY 2.0
[  237.991540] usb 1-1.5: Manufacturer: Jieli Technology
[  237.993188] usb 1-1.5: Found UVC 1.00 device USB PHY 2.0 (1224:2a25)
[  237.996497] input: USB PHY 2.0: GENERAL Webcam as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/input/input1
[  238.004536] usb 1-1.5: set resolution quirk: cval->res = 16
[  348.102430] dwc2 3f980000.usb: dwc2_hc_halt() Channel can't be halted
[  348.109275] dwc2 3f980000.usb: dwc2_hc_halt() Channel can't be halted
 
A google search suggests that it is the USB driver 'dwc2_hc' that is to blame.
 
Trying Raspberry Pi OS instead.
-->
=== Raspberry Pi OS ===


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));
 }