Qt + OpenCV: addWeighted()函数中图片尺寸和通道数不一样的解决方法

 当出现如图所示的错误时,即表明InputArray src1 和 InputArray src2 所拥有的尺寸和通道数不同。

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;


#define WINDOW_NAME "Linear blending example"  //WINDOW_NAME改成中文会出错  Linear blending example


// ^_^ ^_^ ^_^  【全局变量声明部分】 ^_^ ^_^ ^_^
//全局变量声明
const int g_nMaxAlphaValue = 1000; //Alpha值得最大值
                                   //const:限定符,程序中多个地方使用同一常量时,只需修改一个符号定义即可。
int g_nAlphaValueSlider;
double g_dAlphaValue;
double g_dBetaValue;

//存储图片变量声明
Mat lady;
Mat g_srcImage2;
Mat g_dstImage;


//^_^ ^_^ ^_^  【响应滑动条的回调函数】 ^_^ ^_^ ^_^
void on_Trackbar( int, void* )
{
    //求出当前 Alpha 值相对于最大值的比例
    g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue;
    //强制类型转换 g_nAlphaValueSlider 后再除以 g_nMaxAlphaValue

    //则 beta 值为 1 减去 Alpha 值
    g_dBetaValue = ( 1.0 - g_dAlphaValue );

    //根据 Alpha 和 beta 值进行线性混合
    addWeighted( lady, g_dAlphaValue,
                 g_srcImage2, g_dBetaValue,
                 0.0, g_dstImage);  // g_srcImage1 和 g_srcImage2 原则上必须有相同的图片尺寸和通道数,
                                    // 但是也可以通通过 resize 改变

    //显示效果
    imshow( WINDOW_NAME, g_dstImage );
}

//^_^ ^_^ ^_^  【main()函数】 ^_^ ^_^ ^_^

int main()
{
    //加载图像
    lady = imread( "1.jpg" );
    g_srcImage2 = imread( "3.jpg" );
    if( !lady.data )
    {
        printf("Read the first picture error, "
               "please make sure that there is an imread function "
               "in the directory to specify the image exists!\n");
        return -1;  //表示返回一个代数值,一般用在子函数结尾,按照程序开发的一般惯例,表示函数失败。
    }
    if( !g_srcImage2.data )
    {
        printf("Read the first picture error, "
               "please make sure that there is an imread function "
               "in the directory to specify the image exists! \n");
        return -1;
    }

    //设置滚动条初始值为 20
    g_nAlphaValueSlider = 20;
    //强制改变 lady 图像的大小
    resize(g_srcImage2, g_srcImage2, Size(lady.cols, lady.rows));

    //创建窗口
    namedWindow( WINDOW_NAME, 70 );

    //在创建的窗口中创建一个滑动条控件
    char TrackbarName[50];  //声明数组
    sprintf( TrackbarName, "透明值 %d", g_nMaxAlphaValue );

    createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar );

    //在回调函数中显示结果
    on_Trackbar( g_nAlphaValueSlider, 0 );

    //按任意键退出
    waitKey(0);
    return 0;    //表示在主函数结束时,按照程序开发的一般惯例,表示成功完成本函数。

}

resize()函数opencv官方文档说明链接:https://docs.opencv.org/3.4.2/da/d54/group__imgproc__transform.html#ga47a974309e9102f5f08231edc7e7529d

输出结果:

猜你喜欢

转载自blog.csdn.net/qq_40245549/article/details/81317060