opencv 将数据从 *Mat 复制到 Mat

Posted

技术标签:

【中文标题】opencv 将数据从 *Mat 复制到 Mat【英文标题】:opencv copy data from a *Mat to a Mat 【发布时间】:2016-02-09 12:53:14 【问题描述】:

我有两个cv::Mat 对象:

cv::Mat *frameLeftRemap;
cv::Mat frameLeft2;

数据从相机流入 *frameLeftRemap。我需要将数据复制到 frameLeft2,然后删除 frameLeftRemap,以避免我看到的帧伪影。 (这是相机制造商支持台建议的。)

功能是:

  void ProcessImageLeft(AVT::VmbAPI::FramePtr pFrame)
    
        VmbUchar_t *pBuffer;
        VmbUint32_t FrameWidth;
        VmbUint32_t FrameHeight;


        //prepare frame information:
        pFrame->GetWidth(FrameWidth);
        pFrame->GetHeight(FrameHeight);
        pFrame->GetImage(pBuffer);
        //edited
        Mat1b imageL(FrameHeight, FrameWidth, (uchar*)pBuffer);

        cv::remap(imageL, *frameLeftRemap, mx1, my1, cv::INTER_LINEAR);

        frameLeft2 = frameLeftRemap->clone(); 

        //frameLeftRemap->copyTo(frameLeft2);


        cv::imshow("right", frameLeft2);
        cv::waitKey(1);
        delete frameLeftRemap;


    

copyTo 和 clone 都报错:

this is nullPtr. read access violation

我在这里做错了什么?

【问题讨论】:

请发帖minimal reproducible example。正如已经指出的那样,如果您的图像仍然有效,这应该可以正常工作。此外,使用Mat* 通常是个坏主意,因为您可能会破坏内部引用计数(就像您在这里所做的那样) 你为什么还要使用IplImage?请避免使用过时的 C api。请重构此代码以仅使用 Mat。错误可能已经解决了 该部分是来自相机制造商的代码。我将如何将 *pBuffer 直接变成 Mat?谢谢。 Mat1b m(rows, cols, (uchar*)buffer, step) 另外,你应该交换FrameWidthFrameHeightMat1b copyimageL(FrameHeight, FrameWidth, (uchar*)pBuffer); 【参考方案1】:

frameL= frameLeftRemap->clone(); 应该可以正常工作。看来你在frameL 有问题。尝试使用cv::imshowcv::imwrite 显示它,以确保它在克隆之前已损坏。然后解决原来的问题。如果您发布代码,我们会为您提供更多帮助。

【讨论】:

以上是关于opencv 将数据从 *Mat 复制到 Mat的主要内容,如果未能解决你的问题,请参考以下文章

如何在不复制数据的情况下将 OpenCV Mat 发送到 MATLAB 工作区?

从 Mat 元素到 IplImage 的 opencv 转换 *

将 Vector<float> 中的数据复制到 Vector<Mat> (Opencv/C++)

OpenCV/C++:将 Mat 中的行/列复制到另一个?

将 Cv::Mat 的数据存储在 std::vector 中

如何将 Mat 的矩形区域复制到相同大小的新 Mat?