使用实时数据,绕过CvloadImage

时间:2012-06-30 06:28:51

标签: opencv opencvdotnet

这是我们使用Opencv显示和处理图像的方式:

int _tmain(int argc, _TCHAR* argv[]) {
    IplImage* img = cvLoadImage( "MGC.jpg" );
    cvThreshold( img, img,  200, 255, CV_THRESH_BINARY );
    cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
    cvShowImage("Example1", img);
    cvWaitKey(0);
    cvReleaseImage( &img );
    cvDestroyWindow( "Example1" );
    return 0;
}

现在,您可以帮助我实现我的目标,如下所述:

int _tmain(int argc, _TCHAR* argv[]) {
    Some code here (using some API other than OpenCv).... // Captures a frame and  
    //streams the data into a buffer Buf
    Buffer B= Buf; // B contain binary image data i.e 16 bit pixel values
    cvThreshold( B, B,  200, 255, CV_THRESH_BINARY );//Notice I am putting B and not an 
                                                     //Image(legal?)
    cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
    cvShowImage("Example1", B); //Notice I am putting B and not an Image(legal?)   
    cvWaitKey(0);
    cvReleaseImage( &B );
    cvDestroyWindow( "Example1" );
    return 0;
}

请注意,我没有在第二个代码段中使用任何硬盘读/写操作,例如:

  IplImage* img = cvLoadImage( "MGC.jpg" );

基本上我正在处理实时场景,因此我绕过了耗时的cvLoadImage。显然没有将数据保存到硬盘中,我的整个数据仍然在Buffer B。这节省了我的时间,这对我的应用至关重要。

注意:事实是,我将对Buffer B进行更多处理,例如应用cvminmaxloc等。但所有这些功能都需要加载图片来自磁盘,而不是我的情况下的缓冲区。

有人能指出我正确的方向来实现我的目标,即使用Buffers而不是存储在硬盘中的图像吗?我在理解openCV函数时犯了一些错误吗?

更新

下面建议我可以使用imdecode从缓冲区读取图像。如上所述,实际上我将使用OpenCv函数对图像进行处理,例如CVMinMaxLoc

 cvThreshold( src, src,  200, 255, CV_THRESH_BINARY );   

现在我可以将Buffer作为第一个参数而不是cvThreshold( )中的Image吗?如果没有那么用openCv函数处理Buffers(包含像素值)的替代方法是什么?如果没有直接的方法来处理缓冲区,那么实现这一目标的间接方法是什么?有什么工作?

简而言之,我不想在进行任何处理之前将数据带到硬盘上。

4 个答案:

答案 0 :(得分:2)

了解OpenCV的大部分C接口都处理IplImage,而不是Buffer,也不处理任何其他自定义数据类型。换句话说,做:

Buffer B = Buf; 
cvThreshold( B, B,  200, 255, CV_THRESH_BINARY );

会发出编译错误,因为cvThreshold()要求将数据封装在IplImage中。

我不想承担明显上尉的风险,但您需要将Buffer转换为IplImage。人们可能会问,你怎么做到这一点。好吧,IplImage是简单的数据类型,它将这些重要的信息保存在一起:

  • 图片的尺寸(宽度/高度);
  • 图片的位深度;
  • 频道数;
  • 图片的数据(像素);

how do you create a IplImage from scratch?致电cvCreateImageHeader(),然后致电cvSetData()

注意:对于深度参数,您可能希望使用IPL_DEPTH_16U or IPL_DEPTH_16S。如果您的图片是RGB,则频道数为3.使用完IplImage后,请不要忘记致电cvReleaseImage()以释放其资源。

我认为真正的挑战是:您将如何从Buffer中提取所有这些信息。祝你好运!

答案 1 :(得分:1)

C ++ OpenCV API中有imdecode函数,可以解码存储在内存缓冲区中的图像。但是传统的C API中没有类似物。

答案 2 :(得分:0)

我认为你不能把缓冲区(正如你所说的有像素值)代替src,即从下面的磁盘加载的图像

  cvThreshold( src, src,  200, 255, CV_THRESH_BINARY );   

一种方法可能是在MAT中转换缓冲区然后使用cvThreshold。

可能有更多经验的人可能对此发表评论。

答案 3 :(得分:0)

您应该将缓冲区转换为openCV类型Mat

类似的事情here