【问题标题】:OpenCV : convert the pointer in memory to imageOpenCV:将内存中的指针转换为图像
【发布时间】:2012-04-24 20:47:45
【问题描述】:

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

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 指针获取数据并允许我使用图像数据?

【问题讨论】:

  • 您的相机是否不受支持,或者您为什么要弄乱指针?
  • 嗨竹子,我不确定这个,是不是说如果它支持我的相机,我就不需要使用抓帧接口,我可以直接使用OpenCV来获取图像?跨度>
  • 非常感谢。我现在就去试试。
  • 我正在尝试使用此链接中的示例:opencv.willowgarage.com/wiki/CameraCapture,但它一直给我此消息:错误:捕获为 NULL,您知道如何确定 opencv 是否支持我的相机. ??
  • 这里有一个列表,我认为它可能不完整。 opencv.willowgarage.com/wiki/…

标签: c++ c image pointers opencv


【解决方案1】:

unsigned char* raw_data 创建IplImage 需要两条重要指令: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");

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

【讨论】:

  • 嗨,非常感谢您的代码,我正在尝试您的代码,它确实显示任何错误,但在屏幕上它只显示灰色图像并快速关闭窗口。你知道为什么它不显示我的图片吗?
  • 尝试更改cvWaitKey() 中的时间。这是等待按键的毫秒数。我认为您可以尝试通过 0 强制函数等待按键。另外,您的意思是它以灰色阴影显示您的图像,还是仅在窗口内显示一个完整的灰色矩形?你的图片有颜色吗?!?
  • 在这种情况下,将cvNamedWindow() 呼叫排除在循环之外。否则,它将在每次迭代时创建一个新窗口,这可能会导致问题,包括您所看到的问题。
  • 哇,你是明星,它确实有效,它显示了内存中的图像。还有一个问题,因为我是 openCV 的新手,我试图直接使用 openCV 而无需使用图像采集卡,我使用的是 Mikrotron CMOS 高速相机 - Eosens (MC1362) 相机,但没有一个简单的例子,工作,你有什么想法如何使用连接到相机的 OpenCV?
  • 请注意,因为我们在机器人项目中遇到了这个示例的问题 - cv_image-&gt;widthStep 是对齐的行大小(在 OpenCV 文档中查找),而 cvSetData 期望实际行大小,因此在某些情况下,对齐值与实际行大小不匹配,您的像素会发生偏移。
【解决方案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 的文档和教程。

【讨论】:

  • 简单:OP 可能没有从磁盘读取文件。看来他是直接从设备上抓取帧。
  • @karlphillip 那他为什么不使用正确的方法呢?我只是假设问题的性质完全不同。
  • 可能不支持他的设备? ;)
  • @karlphillip 听起来很有道理,我们得问问他。
  • 大家好,非常感谢您为解决我的问题做出的贡献。正如我告诉你的那样,我是 OpenCV 的新手,我不确定它是否支持我的相机。我唯一了解的是我有一个抓帧器,我正在使用抓帧器接口从相机获取数据并将它们存储在内存中,而不是使用抓取器接口,这并没有给我太多选择图像处理 我需要通过 OpenCV 从内存中读取原始数据,然后我可以准备它们进行处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-10
  • 2015-04-15
  • 2018-02-24
  • 2011-12-05
  • 1970-01-01
  • 2021-11-24
  • 2011-11-29
相关资源
最近更新 更多