C++ 将cv::Mat复制到另一个会创建;断言失败0<;=_colRange.start&&&引用;

C++ 将cv::Mat复制到另一个会创建;断言失败0<;=_colRange.start&&&引用;,c++,opencv,C++,Opencv,这是一个非常简单的概念,我有一个640x480的垫子和一个800x480的屏幕,所以我试图将原始图像复制到一个800x480的黑色图像的中心,这样可以保持纵横比,但使用整个屏幕 我遵循post并尝试了两种解决方案(直接复制到和感兴趣的区域),但得到了相同的错误: OpenCV Error: Assertion failed (0 <= _colRange.start && _colRange.start <= _colRange.end && _col

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

我遵循post并尝试了两种解决方案(直接复制到和感兴趣的区域),但得到了相同的错误:

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

我第一次尝试使用(0480)和(80720)的开始/结束范围/行,但后来错误使它听起来好像无法从0开始,所以我当然认为我以1为准,从1开始,结果相同。但实际上,错误是针对列而不是行的,如果列被关1,那就没什么关系了。那么,我想把这张图片复制到什么地方会不一样呢?

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

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

#包括“opencv2/imgproc.hpp”
#包括“opencv2/highgui.hpp”
#包括“iostream”
使用名称空间cv;
使用名称空间std;
int main(int argc,char*argv[])
{
Mat src=imread(argv[1]);
if(src.empty())
{

当然,使用cv::Rect元素更容易访问子映像。
cv::Mat displayimage = cv::Mat(480, 800, modimage1.type(), cv::Scalar(0));
modimage1.copyTo(displayimage.rowRange(0,480).colRange(80,720));
#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;
}