opencv - 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,它工作正常!
我不知道出了什么问题,但所有教程都说我尝试的代码是好的代码。
解决方案
发生此异常是因为我在 Size() 中以错误的顺序设置了宽度和高度。正确的顺序是cv::Size(width(cols)_of_image, height(rows)_of_image)
对于许多教程来说这不是问题,因为他们通常使用正方形大小的图像。
推荐阅读
- vba - Excel VBA 在 50 张纸上运行宏
- amazon-s3 - 上传到 S3 后 CSP 阻止 Fineuploader 缩略图
- macos - 我需要什么调整才能使 ssh://user@machine.com URL 在 mac 中的 iterm2 上与 fish 一起使用?
- typescript - Typescript:基于属性值的类型确定
- javascript - 如何一次将两个值输入 y 轴对应于 Highchart 中的单个 x 轴值
- python-3.x - 在 python 列表中交换的意外行为
- c# - 读取控制台应用程序的输出
- sql - 使用 Regexp_Like() 函数列出字符串
- python - 通过 def 标记化从字符串中删除
- node.js - AWS Api Gateway:NodeJs 发布请求 - 在 cognito 登录用户上“未配置授权”