![](/img/trans.png)
[英]openCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor function
[英]How to interpret c++ opencv Assertion error messages due to an error in cvtColor function?
以下是在opencv中调用cvtColor()函数时的断言错误报告(显示在控制台上),在Mat对象上给出参数CV_GRAY2BGR,该对象已经是BGR图像。 我想知道如何解释这个错误信息的人还不知道这里的错误是什么。 (希望一些博学者不会投票把这个问题作为主题关闭,因为我知道学习读取断言或c ++新手的任何其他错误信息有很大的价值。)而且我猜这可能是最有可能的关于读取断言错误的opencv问题。
OpenCV Error: Assertion failed (scn == 1 && (dcn == 3 ||
dcn == 4)) in cv::cvtColor, file C:\builds\2_4_PackSlave-win32-vc12-shared\open
cv\modules\imgproc\src\color.cpp, line 3791
我知道这里测试了2个条件,
其中一个应该失败,这导致了断言错误。 如何区分和澄清失败的情况? 可能是我可能要寻求cvtColor函数源代码,这将没有问题。 (实际上我做了但是我找不到那个名为scn或dcn的变量那里的improc.cpp类)
这个片段
#include <opencv2\opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
// Just a small green BGR image
Mat3b img(10,10,Vec3b(0,255,0));
Mat1b gray;
cvtColor(img, gray, CV_GRAY2BGR); // WARNING: this won't work (on purpose)
return 0;
}
会产生你的确切错误:
OpenCV错误:断言失败(scn == 1 &&(dcn == 3 || dcn == 4))在cv :: cvtCo lor中,文件C:\\ builds \\ 2_4_PackSlave-win32-vc12-static \\ opencv \\ modules \\ imgproc \\ src \\ c olor.cpp,第3789行
这段代码显然是错误的,因为你试图从GRAY转换BGR图像。
OpenCV告诉你:
由于您使用的是代码
CV_GRAY2BGR
,我希望将GRAY(1通道)源图像转换为BGR(3通道)目标图像。 (即使在这种情况下CV_GRAY2BGRA
更合适,我也允许BGRA(4个频道)作为目标图像。)
在文档 OpenCV告诉你:
在C ++中,OpenCV将此视为
CV_Assert( scn == 1 && (dcn == 3 || dcn == 4));
其中scn
代表“Source Channels Number”, dcn
代表“Destination Channels Number”。
现在最后一点, scn
和dcn
来自哪里? 如果您使用调试器,并按照执行路径,你会看到功能void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
在color.cpp
是(由我添加的注释):
void cv::cvtColor( InputArray _src /* source image*/,
OutputArray _dst /* destination image*/,
int code, /* here is CV_GRAY2BGR*/
int dcn /* defaults to -1*/ )
{
Mat src = _src.getMat(), dst;
...
int scn = src.channels(); // scn is the number of channels of the source image
...
switch( code ) {
...
case CV_GRAY2BGR: case CV_GRAY2BGRA:
if( dcn <= 0 ) dcn = (code==CV_GRAY2BGRA) ? 4 : 3;
// destination channels are set to 3 because of the code CV_GRAY2BGR
// Check that the input arguments are correct
CV_Assert( scn == 1 && (dcn == 3 || dcn == 4));
...
}
在opencv中调用cvtColor()函数,在Mat对象上给出参数CV_GRAY2BGR,该对象已经是BGR图像
你已经在这里回答了自己的问题。 断言本来就是这样的:
CV_Assert( scn == 1 && (dcn == 3 || dcn == 4));
由于您使用的是BGR Mat,因此scn
(源Mat中的通道数)将为3
导致整个表达式计算为false
,并且断言失败。
您正在执行的操作毫无意义。 省略它,你的代码可能会工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.