Qt&OpenCV练习(二)

本文记录了在Qt5环境下使用配置好的OpenCV4库,通过编程生成一张具有渐变效果的彩色图片的过程。程序在.pro文件中声明相关变量,并展示了最终运行结果,即在蓝色背景上,自左向右绿色透明度递增,自上向下红色透明度递增的图像效果。
摘要由CSDN通过智能技术生成

使用配置在Qt5环境下的OpenCV4生成一张彩色图片

本文所涉程序为毛星云/冷雪飞等编著的《OpenCV3编程入门》中所写例程,仅为记录本人学习中所碰到的问题与对程序的理解。
先在.pro文件中声明如下变量

INCLUDEPATH +=D:\Opencv\OpenCV-MinGW-Build-OpenCV-4.1.1-x64\include

LIBS +=D:\Opencv\OpenCV-MinGW-Build-OpenCV-4.1.1-x64\x64\mingCVw\bin\libopencv_core411.dll
LIBS +=D:\Opencv\OpenCV-MinGW-Build-OpenCV-4.1.1-x64\x64\mingw\bin\libopencv_highgui411.dll
LIBS +=D:\Opencv\OpenCV-MinGW-Build-OpenCV-4.1.1-x64\x64\mingw\bin\libopencv_imgproc411.dll
LIBS +=D:\Opencv\OpenCV-MinGW-Build-OpenCV-4.1.1-x64\x64\mingw\bin\libopencv_calib3d411.dll
LIBS +=D:\Opencv\OpenCV-MinGW-Build-OpenCV-4.1.1-x64\x64\mingw\bin\libopencv_imgcodecs411.dll
LIBS +=D:\Opencv\OpenCV-MinGW-Build-OpenCV-4.1.1-x64\x64\mingw\bin\libopencv_videoio411.dll
LIBS +=D:\Opencv\OpenCV-MinGW-Build-OpenCV-4.1.1-x64\x64\mingw\bin\libopencv_video411.dll
//以上放在.pro文件原有代码的最后就好,前面的路径根据自己安装位置不同而改变

程序为

#include<opencv2/opencv.hpp>
#include<vector>
using namespace cv ;
using namespace std;
//创建带alpha通道的Mat
void createAlphaMat(Mat &mat)
{
    //rgba
        //r:red g:green b:blue a:alpha qt使用的是bgr的顺序
    for(int i = 0; i <mat.rows; ++i) {//从第一行开始
        for(int j = 0; j < mat.cols; ++j) {//从第一列开始
            Vec4b&rgba = mat.at<Vec4b>(i, j);//mat.at(i,j),从mat中取出一个像素,像素的类型是Vec4b,该类型含义是,有4个UCHAR类型的元素,其中rgba[0]、rgba[1]、rgab[2]代表像素的三原色,BGR,即为蓝色(Blue)、Green(绿色)、红色(Red)。rgba[3]代表像素的的Alpha值,表示像素的透明度。
            rgba[0]= UCHAR_MAX;//全蓝
            rgba[1]= saturate_cast<uchar>((float (mat.cols - j))/ //saturate_cast<uchar>主要是为了防止颜色溢出操作,相当于是对图像色彩变化时做的保护!
                                          ((float)mat.cols) *UCHAR_MAX);
            rgba[2]= saturate_cast<uchar>((float (mat.cols - i))/
                                          ((float)mat.cols) *UCHAR_MAX);
            rgba[3]=saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
        }//G通道,((float (mat.cols - j)) / ((float)mat.cols) *UCHAR_MAX)表示越往右占的百分比就越少,颜色也就越深,
        //同理,对于B通道,((float (mat.rows - i)) / ((float)mat.rows) *UCHAR_MAX)表示越往下占的百分比就越少,颜色也就越深。
        //最后的透明度,取值为(0.5 * (rgba[1] + rgba[2])也就是取G和B通道的平均值。
    }
}
int main()
{//创建带alpha通道的Mat
    Mat mat(480, 640, CV_8UC4);//创建一个480*640的mat图像,8位无符号四通道(RBG带透明度)的图像
    createAlphaMat(mat);

    vector<int>compression_params;
    compression_params.push_back(IMWRITE_PNG_COMPRESSION);//定义图像的保存质量
    compression_params.push_back(9);
    //显示图片
    try {
        imwrite("透明Alpha值图.png", mat, compression_params);
        imshow("生成的PNG图",mat);
        fprintf(stdout,"PNG图片文件的alpha数据保存完毕~\n可以在工程目录下查看由imwrite函数生成的图片\n");
        waitKey(0);
    } catch (runtime_error& ex) {
        fprintf(stderr,"图像转换成PNG格式发生错误: %s\n", ex.what());
        return 1;
    }

    return 0;
}

在这里插入图片描述
运行结果如图,实质上是在纯蓝色的底上,从左向右填补透明度逐列递增的绿色与从上到下透明度逐行递增的红色

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值