C++ 从指针创建Mat

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(;

我有一个带有全局快门的花式相机,它有自己的一套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(;;){
    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);
    }