我有一个抓取器可以获取图像并使用以下代码在屏幕上显示它们
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指针获取数据允许我使用图像数据?
答案 0 :(得分:5)
从IplImage
创建unsigned 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");
我还没有测试过代码,但是您正在寻找的代码的路线图就在那里。
答案 1 :(得分: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
}
我建议您开始阅读可以找到here的文档和教程。