这是我们使用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
(包含像素值)的替代方法是什么?如果没有直接的方法来处理缓冲区,那么实现这一目标的间接方法是什么?有什么工作?
简而言之,我不想在进行任何处理之前将数据带到硬盘上。
答案 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)