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.error: OpenCV(4.5.2) .error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'