使用配置在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;
}
运行结果如图,实质上是在纯蓝色的底上,从左向右填补透明度逐列递增的绿色与从上到下透明度逐行递增的红色