-1

这是我们使用 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等。但是所有这些功能都需要从磁盘加载的图像,而不是像我这样的缓冲区。

有人可以为我指明正确的方向,以实现使用缓冲区而不是存储在硬盘中的图像的目标吗?我在理解 openCV 功能时犯了一些错误吗?

更新:

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

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

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

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

4

4 回答 4

2

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

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

将发出编译错误,因为cvThreshold()需要将数据封装在IplImage.

我不想冒成为明显船长的风险,但您需要转换BufferIplImage. 那么你是如何做到这一点的,有人可能会问。嗯,IplImage是一个简单的数据类型,将这些重要的信息放在一起:

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

以及如何IplImage从头开始创建?呼叫cvCreateImageHeader()后跟cvSetData()

注意:对于深度参数,您可能希望使用IPL_DEPTH_16U 或 IPL_DEPTH_16S。如果您的图像是 RGB,则通道数为 3。使用完毕后IplImage,不要忘记调用cvReleaseImage()释放它的资源。

我相信真正的挑战是:你将如何从Buffer. 祝你好运!

于 2012-07-06T02:48:52.473 回答
1

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

于 2012-06-30T11:11:34.643 回答
0

我认为您不能将缓冲区(如您所说的具有像素值)代替 src ,即以下从磁盘加载的图像

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

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

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

于 2012-07-03T06:55:57.213 回答
0

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

这里做了类似的事情

于 2012-07-05T13:47:49.343 回答