断言失败与cv :: Size

时间:2018-11-19 14:00:40

标签: opencv opencv3.0

我是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)错误:断言失败((未签名)(i1 *   DataType <_Tp> :: channels)<(无符号)(size.p [1] * channels()))在   cv :: Mat :: at,文件   c:\ opencv343 \ opencv \ build \ include \ opencv2 \ core \ mat.inl.hpp,第1101行

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

我无法弄清楚出什么问题了,但是所有教程都说我尝试的代码是可以的代码。

1 个答案:

答案 0 :(得分:0)

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

对于许多教程而言,这并不是问题,因为它们通常使用方形图像。