我有一个带有全局快门的精美相机,它有自己的一套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,所以我不会在每个循环中重新定义它(如果我错了,请纠正我,但在每个循环中重新定义它将是非常低效的).但是我尝试过的一切都失败了.
任何帮助将非常感谢!
有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)
进一步,
我想有关编译器优化器的评论在某种程度上也是正确的.您的Mat构造函数将仅分配堆栈分配的部分,并且不会执行任何堆分配(因为您指定了自己的数据指针).由于堆栈分配的部分对于每个帧的大小完全相同,我认为编译器至少会重复使用相同的地址.设置每个帧的宽度和高度可能会有一些开销,但这确实是最小的努力.
我非常怀疑地址指针image.bp是否稳定并且不会每帧都改变.驱动程序更喜欢重用预先分配的内存,而不是分割堆.如果是这种情况,你甚至可以省略frame.data = image.bp;上面的那一行.
| 归档时间: |
|
| 查看次数: |
1034 次 |
| 最近记录: |