void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int),文件 /../Linux/./../src/ 中的断言失败 (scn == 3

Posted

技术标签:

【中文标题】void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int),文件 /../Linux/./../src/ 中的断言失败 (scn == 3 || scn == 4)颜色.cpp,第 8000 行【英文标题】:Assertion failed (scn == 3 || scn == 4) in void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int), file /../Linux/./../src/color.cpp, line 8000 【发布时间】:2017-12-28 11:19:59 【问题描述】:

我正在尝试使用本机代码学习 openCv,我正在参考 here。 我使用 ndk-build 成功构建了项目。 现在我想更改scan.cpp 文件,该文件负责获取图像点、裁剪、扫描和设置颜色。 我想为文件中的第 321 行给出不同的参数 cvtColor(mbgra, dst, CV_BGR2GRAY); 我可以为 CV_BGR2GRAY 提供任何其他论据吗? 如果是怎么办?如果没有,为什么?

如果我遗漏了什么,请指导我并告诉我。 谢谢。

【问题讨论】:

看来你的问题是关于 C++ 的。标记C和java而不是C++的原因是什么? @Yunnosch 哎呀,我很抱歉,我现在非常沮丧,这可能是原因.. 你能帮我解决这个问题吗? 【参考方案1】:

是的,你可以给出任何你想要的论点。你会得到一个合理的输出吗?这取决于。 CV_BGR2GRAY 需要 BGR(3 通道)输入并将输出灰色(1 通道)。

如果您输入的是 3 通道 BGR(即使它不是真正的 BGR,opencv 也不会在意)您可以使用任何 3 通道转换,例如 CV_BGR2HSV 这将导致 3 通道 HSV 输出。

如果您的输入是 1 个通道 - 显然您将无法使用 BGR 2 GREY。

Mat bgraImage = imread("BGRA_IMAGE.png", -1);  // 4 channel input image
Mat grayImage = imread("GRAY_IMAGE.png", CV_LOAD_IMAGE_GRAYSCALE);  // 1 channel input image
Mat result;

cvtColor(bgraImage, result, CV_BGRA2GRAY);    // CORRECT, input 4 channel, output will be 1 channel
cvtColor(bgraImage, result, CV_BGR2GRAY);    // ALSO CORRECT
cvtColor(grayImage, result, CV_BGR2GRAY);    // INCORRECT & will crash, input is 1 channel, expecting 3 or 4
cvtColor(grayImage, result, CV_GRAY2BGR);    // CORRECT, input is 1 channel, output is 3 channel

您可以查看所有可能的颜色转换 here 并阅读有关它们的更多信息 here

【讨论】:

谢谢,但我不明白你所说的。我写了 Mat mbgra(info.height, info.width, CV_8UC4, pixel); // 初始化我们的输出图像 Mat dst = mbgra.clone(); cvtColor(mbgra, dst, CV_BGR2GRAY);在 mat_to_bitmap() if(info.format == android_BITMAP_FORMAT_RGBA_8888) __android_log_print(ANDROID_LOG_VERBOSE, APPNAME,"ANDROID_BITMAP_FORMAT_RGBA_8888", i); Mat tmp(info.height, info.width, CV_8UC4, 像素); if(src.type() == CV_8UC1) cvtColor(src, tmp, CV_GRAY2RGBA);但是如果我写 CV_BGR2GRAY 会出现错误 ** Mat mbgra(info.height, info.width, CV_8UC4, 像素); ** 表示它的输入是通道 4? 如果 src 只有 1 个通道而不是 cvtColor(src, tmp, CV_GRAY2RGBA);是正确的,因为 GRAY2RGBA 需要 1 个通道作为输入。如果您尝试使用 1 通道 src 作为输入的 BGR2GRAY - 这显然是不正确的,因为 BGR 2 gray 需要 3 通道作为输入(也可以接受 4 通道输入)。 我怎么知道哪个颜色代码需要哪个频道?你能给我提供链接/数据吗! 好的,非常感谢,我已经接受了你的回答,但我没有声望支持:(

以上是关于void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int),文件 /../Linux/./../src/ 中的断言失败 (scn == 3的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV VideoCapture 和错误:(-215:断言失败)!_src.empty() in function 'cv::cvtColor'

!_src.empty() 在函数 'cv::cvtColor' imgproc\src\color.cpp:182

cv2.cvtColor 错误。是虫子吗?

cv2.error: OpenCV(4.5.2) .error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

怎么在python中使用cv2.cvtcolor

OpenCV的颜色空间(cv2.cvtColor)