从指针创建Mat

HaM*_*ani 1 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);
}
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将非常感谢!

tof*_*fi9 5

frame.data(的Mat::data成员),你可以每当你获得使用新的帧的时间重新分配xiGetImage代码.执行此操作时,请确保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);
}
Run Code Online (Sandbox Code Playgroud)

进一步,

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

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