【问题标题】:Copy an cv::Mat inside a ROI of another one在另一个的 ROI 内复制一个 cv::Mat
【发布时间】:2012-05-15 22:06:44
【问题描述】:

我需要将cv::Mat 图像(源)复制到另一个(目标)cv::Mat 图像的 ROI。

我找到了this reference,但它似乎不适用于我的情况。 你有什么指示我如何使用 OpenCV C++ 接口来做到这一点?

【问题讨论】:

    标签: c++ opencv copy roi


    【解决方案1】:

    OpenCV 2.4:

    src.copyTo(dst(Rect(left, top, src.cols, src.rows)));
    

    OpenCV 2.x:

    Mat dst_roi = dst(Rect(left, top, src.cols, src.rows));
    src.copyTo(dst_roi);
    

    【讨论】:

    • 谢谢!我这样做并且效果很好: bboxImage.copyTo(destImage.colRange(startCol,startCol+bboxImage.cols).rowRange(startRow,startRow+bboxImage.rows));
    • 在 OpenCV 2.4.6 中产生 no matching function for call to ‘cv::Mat::copyTo(cv::Mat)’ viewtest2.cpp:172:61: note: candidates are: /usr/include/opencv2/core/core.hpp:1651:10: note: void cv::Mat::copyTo(cv::OutputArray) const。然而,第二种解决方案确实有效,但它会产生一个只有 src 的图像。
    • 与之前版本的opencv有什么区别?为什么代码不同?
    • src.copyTo(dst(Rect(left, top, src.cols, src.rows)); 3x '(' 和 2x ')'? Mat dst_roi = dst(Rect(left, top, src.cols, src.rows); 2x '(' 和 1x ')'?未经测试的代码?
    • valgrind 在我使用 OpenCV 3.2 执行此操作时报告内存泄漏。但它有效^^
    【解决方案2】:

    除了以上答案的补充或更正,如果你想将一个较小的开放区域Mat复制到另一个Mat,你应该这样做:

    src(Rect(left,top,width, height)).copyTo(dst);
    

    【讨论】:

      【解决方案3】:

      确实以这种方式为我工作:

      Mat imgPanel(100, 250, CV_8UC1, Scalar(0));
      Mat imgPanelRoi(imgPanel, Rect(0, 0, imgSrc.cols, imgSrc.rows));
      imgSrc.copyTo(imgPanelRoi);
      
      imshow("imgPanel", imgPanel);
      waitKey();
      

      我正在使用 Opencv 2.4.9 基于安德烈的回答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-04
        • 1970-01-01
        相关资源
        最近更新 更多