gpt4 book ai didi

c++ - 从指针创建 Mat

转载 作者:太空宇宙 更新时间:2023-11-03 22:00:56 25 4
gpt4 key购买 nike

我有一个带有全局快门的精美相机,它有自己的一组 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,这样我就不会在每个循环中都重新定义它(如果我错了请纠正我,但在每个循环中重新定义它会非常低效)。但是我尝试的一切都失败了。

如有任何帮助,我们将不胜感激!

最佳答案

有一个 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);
}

进一步,

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

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

关于c++ - 从指针创建 Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26498447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com