从指针创建Mat

时间:2014-10-22 00:10:41

标签: c++ opencv

我有一个带有全局快门的精美相机,它拥有自己的一套API。我一直在尝试做的是初始化相机并在精确的定时循环中触发快门。然后,相机API返回指向图像第一个像素的指针(让我们称之为image.bp)。

我的代码看起来像这样:

XI_IMG image; //image type specified by the manufacturer. the image.bp points to the first pixel of the image
camera initialization ...
for(;;){
    xiGetImage(xiH, timeOut, &image); //API given by the camera manufacturer
    Mat frame(image.height, image.width, CV_8U, image.bp);
    imshow(window_name,frame);
}

现在这段代码工作了。但我一直试图做的是在for循环之前将“frame”定义为mat,所以我不会在每个循环中重新定义它(如果我错了,请纠正我,但在每个循环中重新定义它将是非常低效的)。但是我尝试的一切都失败了。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:5)

每次使用frame.data代码获取新框架时,都可以重新分配Mat::dataxiGetImage成员)。执行此操作时,请确保使用有效的图像指针初始化frame对象,而不是省略最后一个参数。这样,您的Mat对象将不会分配自己的内存(并最终泄漏它)。

XI_IMG image; //image type specified by the manufacturer. the image.bp points to the first pixel of the image camera initialization ...

xiGetImage(xiH, timeOut, &image); //API given by the camera manufacturer
Mat frame(image.height, image.width, CV_8U, image.bp);

for(;;){
    xiGetImage(xiH, timeOut, &image); //API given by the camera manufacturer
    frame.data = image.bp;
    imshow(window_name,frame);
}

此外,

  1. 我想有关编译器优化器的评论在某种程度上也是正确的。您的Mat构造函数将仅分配堆栈分配的部分,并且不会执行任何堆分配(因为您指定了自己的数据指针)。由于堆栈分配的部分对于每个帧的大小完全相同,我认为编译器至少会重复使用相同的地址。设置每个帧的宽度和高度可能会有一些开销,但这是非常小的努力。

  2. 我非常怀疑image.bp中的地址指针是稳定的,并且不会每帧都改变。驱动程序更喜欢重用预先分配的内存,而不是分割堆。如果是这种情况,您甚至可以省略上面的行frame.data = image.bp;

相关问题