uint8_t* VideoIIDC1394::yuvFrameData(void) { #if defined(DUNE_WITH_DC1394) std::cout << "Starting conversion to YUV 422" << std::endl; frameCapture(); converted_frame->color_coding = DC1394_COLOR_CODING_YUV422; dc1394_convert_frames(frame, converted_frame); std::cout << "Finished up conversion to YUV 422" << std::endl; dc1394_capture_enqueue(camera, frame); return converted_frame->image; #else return NULL; #endif }
uint8_t* VideoIIDC1394::rawFrameData(void) { #if defined(DUNE_WITH_DC1394) frameCapture(); converted_frame->color_coding = DC1394_COLOR_CODING_YUV422; converted_frame->yuv_byte_order = DC1394_BYTE_ORDER_YUYV; dc1394_convert_frames(frame, converted_frame); dc1394_capture_enqueue(camera, frame); return converted_frame->image; #else return NULL; #endif }
void ofxLibdc::getOneShot(ofImage& img) { setTransmit(false); flush(); dc1394_video_set_one_shot(camera, DC1394_ON); dc1394video_frame_t *frame; dc1394_capture_dequeue(camera, DC1394_CAPTURE_POLICY_WAIT, &frame); img.allocate(width, height, imageType); if(imageType == OF_IMAGE_GRAYSCALE) { memcpy(img.getPixels(), frame->image, width * height); } else if(imageType == OF_IMAGE_COLOR) { // this shouldn't be reallocated every frame! dc1394video_frame_t* rgbFrame = (dc1394video_frame_t*) calloc(1, sizeof(dc1394video_frame_t)); rgbFrame->color_coding = DC1394_COLOR_CODING_RGB8; dc1394_convert_frames(frame, rgbFrame); memcpy(img.getPixels(), rgbFrame->image, 3 * width * height); free(rgbFrame); } img.setFromPixels(frame->image, width, height, imageType); dc1394_capture_enqueue(camera, frame); }
bool CvCaptureCAM_DC1394_v2_CPP::grabFrame() { dc1394capture_policy_t policy = DC1394_CAPTURE_POLICY_WAIT; bool code = false, isColor; dc1394video_frame_t *dcFrame = 0, *fs = 0; int i, nch; if (!dcCam || (!started && !startCapture())) return false; dc1394_capture_dequeue(dcCam, policy, &dcFrame); if (!dcFrame) return false; if (/*dcFrame->frames_behind > 1 ||*/ dc1394_capture_is_frame_corrupt(dcCam, dcFrame) == DC1394_TRUE) { goto _exit_; } isColor = dcFrame->color_coding != DC1394_COLOR_CODING_MONO8 && dcFrame->color_coding != DC1394_COLOR_CODING_MONO16 && dcFrame->color_coding != DC1394_COLOR_CODING_MONO16S; if (nimages == 2) { fs = (dc1394video_frame_t*)calloc(1, sizeof(*fs)); //dc1394_deinterlace_stereo_frames(dcFrame, fs, DC1394_STEREO_METHOD_INTERLACED); dc1394_deinterlace_stereo_frames_fixed(dcFrame, fs, DC1394_STEREO_METHOD_INTERLACED); dc1394_capture_enqueue(dcCam, dcFrame); // release the captured frame as soon as possible dcFrame = 0; if (!fs->image) goto _exit_; isColor = colorStereo; } nch = isColor ? 3 : 1; for (i = 0; i < nimages; i++) { IplImage fhdr; dc1394video_frame_t f = fs ? *fs : *dcFrame, *fc = &f; f.size[1] /= nimages; f.image += f.size[0] * f.size[1] * i; // TODO: make it more universal if (isColor) { if (!frameC) frameC = (dc1394video_frame_t*)calloc(1, sizeof(*frameC)); frameC->color_coding = nch == 3 ? DC1394_COLOR_CODING_RGB8 : DC1394_COLOR_CODING_MONO8; if (nimages == 1) { dc1394_convert_frames(&f, frameC); dc1394_capture_enqueue(dcCam, dcFrame); dcFrame = 0; } else { f.color_filter = bayerFilter; dc1394_debayer_frames(&f, frameC, bayer); } fc = frameC; } if (!img[i]) img[i] = cvCreateImage(cvSize(fc->size[0], fc->size[1]), 8, nch); cvInitImageHeader(&fhdr, cvSize(fc->size[0], fc->size[1]), 8, nch); cvSetData(&fhdr, fc->image, fc->size[0]*nch); // Swap R&B channels: if (nch==3) cvConvertImage(&fhdr,&fhdr,CV_CVTIMG_SWAP_RB); if( rectify && cameraId == VIDERE && nimages == 2 ) { if( !maps[0][0] || maps[0][0]->width != img[i]->width || maps[0][0]->height != img[i]->height ) { CvSize size = cvGetSize(img[i]); cvReleaseImage(&maps[0][0]); cvReleaseImage(&maps[0][1]); cvReleaseImage(&maps[1][0]); cvReleaseImage(&maps[1][1]); maps[0][0] = cvCreateImage(size, IPL_DEPTH_16S, 2); maps[0][1] = cvCreateImage(size, IPL_DEPTH_16S, 1); maps[1][0] = cvCreateImage(size, IPL_DEPTH_16S, 2); maps[1][1] = cvCreateImage(size, IPL_DEPTH_16S, 1); char buf[4*4096]; if( getVidereCalibrationInfo( buf, (int)sizeof(buf) ) && initVidereRectifyMaps( buf, maps[0], maps[1] )) ; else rectify = false; } cvRemap(&fhdr, img[i], maps[i][0], maps[i][1]); } else cvCopy(&fhdr, img[i]); } code = true; _exit_: if (dcFrame) dc1394_capture_enqueue(dcCam, dcFrame); if (fs) { if (fs->image) free(fs->image); free(fs); } return code; }