cv::Size 断言失败

Assertion Failure with cv::Size

我是 OpenCV 的新手,在声明 Mat 实例时遇到了问题。

#include <opencv2\opencv.hpp>
int main(int argc, char *argv[]) {

    cv::Mat before = cv::imread("./irene.jpg", CV_LOAD_IMAGE_COLOR);

    cv::imshow("before", before);
    cv::waitKey(0);

    cv::Mat after(cv::Size(before.rows, before.cols), CV_8UC3);

    for (int y = 0; y < before.rows; y++) {
        for (int x = 0; x < before.cols; x++) {
            after.at<cv::Vec3b>(y, x)[0] = before.at<cv::Vec3b>(y, x)[2];
            after.at<cv::Vec3b>(y, x)[1] = before.at<cv::Vec3b>(y, x)[1];
            after.at<cv::Vec3b>(y, x)[2] = before.at<cv::Vec3b>(y, x)[0];
        }
    }

    cv::imshow("after", after);
    cv::waitKey(0);
    return 0;
}

只是一个改变图像颜色的简单代码。 问题是,当我尝试使用 cv::Size() 时,编译器 returns 断言失败 。它构建正常,但是当我尝试按任意键转到下一个代码时,它会出现异常。

编译器引用并放在控制台上的是:

OpenCV(3.4.3) Error: Assertion failed ((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())) in cv::Mat::at, file c:\opencv343\opencv\build\include\opencv2\core\mat.inl.hpp, line 1101

我确定异常是由于 Size() 结构而引发的,因为如果我更改 Size(before.rows, before.cols)before.rows,before.cols,效果很好!

我不知道哪里出了问题,但所有教程都说我试过的代码没问题。

出现此异常是因为我在 Size() 中设置的宽度和高度顺序错误。 正确的顺序是 cv::Size(width(cols)_of_image, height(rows)_of_image)

对于许多教程来说这不是问题,因为它们通常使用方形尺寸的图像。