首页 > 解决方案 > 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() 时,编译器返回Assertion Failure。它构建得很好,但是当我尝试按任意键进入代码的下一个时,它会产生异常。

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

OpenCV(3.4.3) 错误:断言失败 ((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())) in cv::Mat::at ,文件 c:\opencv343\opencv\build\include\opencv2\core\mat.inl.hpp,第 1101 行

我确定由于 Size() 结构而引发了异常,因为如果我将Size(before.rows, before.cols)更改为before.rows, before.cols,它工作正常!

我不知道出了什么问题,但所有教程都说我尝试的代码是好的代码。

标签: opencvopencv3.0

解决方案


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

对于许多教程来说这不是问题,因为他们通常使用正方形大小的图像。


推荐阅读