繁体   English   中英

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

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

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

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

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

在C ++中,OpenCV将此视为

CV_Assert( scn == 1 && (dcn == 3 || dcn == 4));

其中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));
    ...
}        

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM