Sam*_*nga 4 c++ opencv assertion
以下是在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
Run Code Online (Sandbox Code Playgroud)
我知道这里测试了2个条件,
其中一个应该失败,这导致了断言错误.如何区分和澄清失败的情况?可能是我可能要寻求cvtColor函数源代码,这将没有问题.(实际上我做了但是我找不到那个名为scn或dcn的变量,那里的improc.cpp类)
Mik*_*iki 15
这个片段
#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;
}
Run Code Online (Sandbox Code Playgroud)
会产生你的确切错误:
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通道)目标图像.(我也允许BGRA(4个频道)作为目标图像,即使CV_GRAY2BGRA在这种情况下更合适.)
在文档 OpenCV告诉你:
在C++中,OpenCV将此视为
CV_Assert( scn == 1 && (dcn == 3 || dcn == 4));
Run Code Online (Sandbox Code Playgroud)
where 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));
...
}
Run Code Online (Sandbox Code Playgroud)