如何解释由于cvtColor函数中的错误导致的c ++ opencv断言错误消息?

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个条件,

  1. (scn == 1)
  2. (dcn == 3 || dcn == 4)

其中一个应该失败,这导致了断言错误.如何区分和澄清失败的情况?可能是我可能要寻求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告诉你:

  • src:输入图像:8位无符号,16位无符号(CV_16UC ...)或单精度浮点.
  • dst:输出与src 大小和深度相同的图像.
  • 代码:颜色空间转换代码(参见下面的描述).
  • dstCn:目标图像中的通道数 ; 如果参数为0,则从src和代码自动导出通道数.

在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".

现在最后一点,做scndcn来自哪里?如果您使用调试器并遵循执行路径,您将在函数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)