2

我有一个抓取器,它可以获取图像并使用以下代码在屏幕上显示它们

while((lastPicNr = Fg_getLastPicNumberBlockingEx(fg,lastPicNr+1,0,10,_memoryAllc))<200) {                                                           
                iPtr=(unsigned char*)Fg_getImagePtrEx(fg,lastPicNr,0,_memoryAllc);                  
                ::DrawBuffer(nId,iPtr,lastPicNr,"testing");                                         }

但我想使用指向图像数据的指针并用 OpenCV 显示它们,因为我需要对像素进行处理。我的相机是 CCD 单声道相机,像素深度为 8 位。我是 OpenCV 的新手,opencv 中是否有任何选项可以返回 (unsigned char*)Fg_getImagePtrEx(fg,lastPicNr,0,_memoryAllc); 并将其显示在屏幕上?或从 iPtr 指针获取数据并允许我使用图像数据?

4

2 回答 2

5

创建IplImagefromunsigned char* raw_data需要 2 个重要说明:cvCreateImageHeader()cvSetData()

// 1 channel for mono camera, and for RGB would be 3
int channels = 1; 
IplImage* cv_image = cvCreateImageHeader(cvSize(width,height), IPL_DEPTH_8U, channels);
if (!cv_image)
{
    // print error, failed to allocate image!
}

cvSetData(cv_image, raw_data, cv_image->widthStep);

cvNamedWindow("win1", CV_WINDOW_AUTOSIZE);
cvShowImage("win1", cv_image);
cvWaitKey(10);

// release resources
cvReleaseImageHeader(&cv_image);
cvDestroyWindow("win1");

我还没有测试过代码,但是您正在寻找的代码的路线图就在那里。

于 2012-04-12T14:11:20.323 回答
2

如果您使用的是 C++,我不明白您为什么不以这样的简单方式进行操作:

如果您的相机受支持,我会这样做:

   cv::VideoCapture capture(0);

   if(!capture.isOpened()) {
     // print error
     return -1;
   }

   cv::namedWindow("viewer");

   cv::Mat frame;

   while( true )
   {
     capture >> frame;

     // ... processing here

     cv::imshow("viewer", frame);
     int c = cv::waitKey(10);
     if( (char)c == 'c' ) { break; } // press c to quit
   }

我建议您开始阅读您可以在此处找到的文档和教程。

于 2012-04-12T14:28:08.950 回答