C++ 从指针创建Mat
我有一个带有全局快门的花式相机,它有自己的一套API。我一直试图做的是初始化相机,并在一个精确的定时循环中触发快门。CameraAPI然后返回指向图像第一个像素的指针(我们称之为image.bp) 我的代码如下所示:C++ 从指针创建Mat,c++,opencv,C++,Opencv,我有一个带有全局快门的花式相机,它有自己的一套API。我一直试图做的是初始化相机,并在一个精确的定时循环中触发快门。CameraAPI然后返回指向图像第一个像素的指针(我们称之为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(;
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
代码获取新帧时重新分配。执行此操作时,请确保使用有效的图像指针初始化帧
对象,而不是忽略最后一个参数。这样,您的Mat
对象将不会分配自己的内存(并最终泄漏内存)
此外
Mat
构造函数将只分配堆栈分配的部分,而不会进行任何堆分配(正如您指定的数据指针)。由于堆栈分配的部分对于每个帧都是完全相同的大小,我假设编译器至少会重复使用相同的地址。在设置每个帧的宽度和高度时可能会有一些开销,但这实际上是最小的工作量image.bp
中的地址指针是稳定的,不会每帧都改变。驱动程序更喜欢重用预先分配的内存,而不是对堆进行分段。如果是这种情况,甚至可以省略行frame.data=image.bp代码>以上
每次使用
xiGetImage
代码获取新帧时,都可以重新分配frame.data
(Mat::data
成员)。执行此操作时,请确保使用有效的图像指针初始化帧
对象,而不是忽略最后一个参数。这样,您的Mat
对象将不会分配自己的内存(并最终泄漏内存)
此外
Mat
构造函数将只分配堆栈分配的部分,而不会进行任何堆分配(正如您指定的数据指针)。由于堆栈分配的部分对于每个帧都是完全相同的大小,我假设编译器至少会重复使用相同的地址。在设置每个帧的宽度和高度时可能会有一些开销,但这实际上是最小的工作量image.bp
中的地址指针是稳定的,不会每帧都改变。驱动程序更喜欢重用预先分配的内存,而不是对堆进行分段。如果是这种情况,甚至可以省略行frame.data=image.bp代码>以上
如果我错了,请纠正我的错误,但在每个循环中重新定义它将非常低效
您可能错了,现代编译器可以优化惩罚。即使有处罚,也只有在分析后明显影响应用程序速度的情况下才应该更改。目前我没有发现任何特殊问题。我只是想看看是否有一种不同的方法可以用来比较。在这种情况下,我不介意犯错。只是让我的生活更轻松。谢谢你的帮助:)顺便说一句,还有一个问题一直困扰着我。我是否需要在imshow之后执行frame.release()?谢谢因为这个方法是在析构函数中自动调用的,或者由任何其他改变数据指针的方法调用的,所以通常不需要它。
谢谢。这回答了我的问题。如果我错了,请纠正我的错误,但在每个循环中重新定义它将非常低效。您可能错了,现代编译器可以优化惩罚。即使有处罚,也只有在分析后明显影响应用程序速度的情况下才应该更改。目前我没有发现任何特殊问题。我只是想看看是否有一种不同的方法可以用来比较。在这种情况下,我不介意犯错。只是让我的生活更轻松。谢谢你的帮助:)顺便说一句,还有一个问题一直困扰着我。我是否需要在imshow之后执行frame.release()?谢谢因为这个方法是在析构函数中自动调用的,或者由任何其他改变数据指针的方法调用的,所以通常不需要它。
谢谢。这回答了我的问题,谢谢。这回答了我的问题,谢谢。这回答了我的问题。
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);
}