【问题标题】:Copying cv::Mat to another creates "assertion failed 0 <= _colRange.start && .."将 cv::Mat 复制到另一个会创建“断言失败 0 <= _colRange.start && ..”
【发布时间】:2016-08-08 07:46:32
【问题描述】:

一个非常简单的概念,我有一个 640x480 的垫子和一个 800x480 的屏幕,所以我试图将原始图像复制到黑色 800x480 图像的中心,以便保持纵横比但使用整个屏幕。

我关注this 的帖子并尝试了两种解决方案(直接复制到感兴趣的区域)并得到相同的错误:

OpenCV Error: Assertion failed (0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols) in Mat, file /home/pi/opencv-3.0.0/modules/core/src/matrix.cpp, line 464
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/pi/opencv-3.0.0/modules/core/src/matrix.cpp:464: error: (-215) 0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols in function Mat

Aborted

违规代码:

cv::Mat displayimage = cv::Mat(800, 480, CV_16U, cv::Scalar(0));
modimage1.copyTo(displayimage.rowRange(1,480).colRange(81,720));

我首先尝试使用 (0,480) 和 (80,720) 的开始/结束范围/行,但随后错误使其听起来无法从 0 开始,所以我当然认为我偏离了 1我从 1 开始,结果相同。但实际上,错误是针对 COLUMNS 而不是 ROWS,并且列偏离 1 甚至都无关紧要。那么我试图将这张图片复制到哪里有什么不喜欢的地方呢?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    呃,这个比我想象的要容易。 cv::Mat() 参数是高度然后宽度,而不是宽度然后高度。棘手。但是我也遇到了错误,因为我的垫子类型的通道数错误,所以为了使代码防弹,我只是将它初始化为将复制到它的图像的相同图像类型,所以下面的代码可以正常工作:

    cv::Mat displayimage = cv::Mat(480, 800, modimage1.type(), cv::Scalar(0));
    modimage1.copyTo(displayimage.rowRange(0,480).colRange(80,720));
    

    【讨论】:

    • 恕我直言,使用 cv::Rect 元素更容易访问子图像。
    【解决方案2】:

    你可以使用cv::copyMakeBorder

    #include "opencv2/imgproc.hpp"
    #include "opencv2/highgui.hpp"
    #include "iostream"
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        Mat src = imread(argv[1]);
        if (src.empty())
        {
            cout << endl
                 << "ERROR! Unable to read the image" << endl
                 << "Press a key to terminate";
            cin.get();
            return 0;
        }
    
        imshow("Source image", src);
    
        Mat dst;
    
        Size dst_dims = Size(800,480);
        int top = ( dst_dims.height - src.rows ) / 2;
        int bottom = ( (dst_dims.height + 1) - src.rows ) / 2;
        int left = ( dst_dims.width - src.cols ) / 2;
        int right = ( ( dst_dims.width + 1 ) - src.cols ) / 2;
    
        copyMakeBorder(src, dst, top, bottom, left, right, BORDER_CONSTANT, Scalar(0,0,0));
    
        imshow("New image", dst);
        waitKey();
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2019-05-04
      • 2017-12-24
      • 2023-03-23
      • 2020-04-03
      • 1970-01-01
      相关资源
      最近更新 更多