static void *capture_loop( void *d ) { struct dc1394_input *conf = (struct dc1394_input *)d; struct frame *f; int cam; for(;;) { dc1394_dma_multi_capture( conf->camera, conf->cam_count ); for( cam = 0; cam < conf->cam_count; ++cam ) { if( conf->cam[cam].running && ( f = new_frame() ) ) { f->length = HEIGHT * WIDTH * 2; f->format = FORMAT_RAW_UYVY; f->width = WIDTH; f->height = HEIGHT; f->key = 1; memcpy( f->d, conf->camera[cam].capture_buffer, f->length ); if( soft_queue_add( conf->cam[cam].outq, f ) < 0 ) unref_frame( f ); } dc1394_dma_done_with_buffer( &conf->camera[cam] ); } } return NULL; }
void capture_frame() { static int have_warned = 0; dc1394_dma_multi_capture(cameras, numCameras); if (!freeze && adaptor >= 0) { for (int i = 0; i < numCameras; i++) { // create OpenCV image switch (res) { case MODE_640x480_YUV411: if (!have_warned) { have_warned = 1; printf("WARNING: no OpenCV conversion available for this format\n"); } //iyu12yuy2((unsigned char *) cameras[i].capture_buffer, // frame_buffer + (i * frame_length), // (device_width * device_height)); break; case MODE_320x240_YUV422: case MODE_640x480_YUV422: if (!have_warned) { have_warned = 1; printf("WARNING: no OpenCV conversion available for this format\n"); } // memcpy(frame_buffer + (i * frame_length), // cameras[i].capture_buffer, device_width * device_height * 2); break; case MODE_640x480_RGB: // don't convert for OpenCV, this is the correct format readOnlyImg->imageData = (char *) cameras[i].capture_buffer; if (async_processing) { if (i==0) { hvAsyncGetImageBuffer(&m_async_image, &m_async_bufID); cvCopy(readOnlyImg, m_async_image); } } else { cvCopy(readOnlyImg, iplImages[i]); } break; } if (verbose) { CvFont font; cvInitFont(&font, CV_FONT_VECTOR0, 0.5f /* hscale */ , 0.5f /* vscale */ , 0.1f /*italic_scale */ , 1 /* thickness */ , 8); char str[256]; sprintf(str, "camera id: %d", i); CvSize textsize; int underline; cvGetTextSize(str, &font, &textsize, &underline); CvPoint pos = cvPoint(iplImages[i]->width - textsize.width - 5, textsize.height + 10); cvPutText(iplImages[i], str, pos, &font, CV_RGB(0, 255, 0)); // cvRectangle(iplImages[i], cvPoint(10, 10), cvPoint(100, 100), // cvScalar(255, 255, 255, 255), CV_FILLED, 8, 0); } } } for (int i = 0; i < numCameras; i++) { dc1394_dma_done_with_buffer(&cameras[i]); } }