编程环境:
VS + OpenCV + C++
完整代码已经更新至GitHub,欢迎fork~GitHub链接
声明:创作不易,未经授权不得复制转载
statement:No reprinting without authorization
内容:
1.利用图像库的功能,实现从文件加载图像,并在窗口中进行显示的功能;利用常见的图像文件格式(.jpg; .png; .bmp; .gif等)进行测试;
2.现有一张4通道透明图像a.png:从其中提取出alpha通道并显示;用alpha混合,为a.png替换一张新的背景;
补充环境配置问题:
下载安装VS2017和opencv3.4时相关配置及环境变量问题,参考网页链接:https://blog.csdn.net/weixin_39393712/article/details/79583274
code one 读取图像显示
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
cout << CV_VERSION << endl;
//读取一张图片便显示出来
Mat src = imread("a.png");//读取图片,要提前将图片放在程序路径下
cvtColor(src, src, CV_BGR2GRAY);//转为灰度图
/*
namedWindow()函数
用法:namedWindow(“img”,x);
x=WINDOW_AUTOSIZE:用户不能手动改变窗口大小,默认为此
x=WINDOW_Normal:用户可以手动改变窗口大小
x=WINDOW_OpenGL:支持openGL
*/
namedWindow("img",WINDOW_NORMAL);
imshow("img", src);
imwrite("C:\\Users\\wangbinKF\\Desktop\\01.bmp", src);//保存结果图片
waitKey(0);//暂停等待按键
return 0;
}
code two 提取图像alpha通道并显示
从其中提取出alpha通道并显示,结果如下:
image.png
image.png
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("a.png", -1);//-1使能读取第4个RGBA中的A通道,即为alpha通道
Mat mat(img.rows, img.cols, CV_8UC1);//可以创建----8位无符号的单通道---灰度图片------grayImg
for (int i = 0; i < img.rows; ++i)
{
for (int j = 0; j < img.cols; ++j)
{
mat.at<uchar>(i, j) = img.at<Vec4b>(i, j)[3];
}
}
namedWindow("alpha通道图像");
imshow("alpha通道图像", mat);
waitKey();
return 0;
}
code three 获取alpha混合图像
利用ppt软件工具自行填充另存得到纯色的png背景图片,最后结果如下:
image.png
image.png
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("a.png", -1);
Mat back_img = imread("back_a.png", -1);
Mat mat(img.rows, img.cols, CV_8UC4);//#define CV_8UC4 CV_MAKETYPE(CV_8U,4)可以创建-----8位无符号的四通道---带透明色的RGB图像
for (int i = 0; i < img.rows; ++i)
{
for (int j = 0; j < img.cols; ++j)
{
double temp = img.at<Vec4b>(i, j)[3] / 255.00;
mat.at<Vec4b>(i, j)[0] = (1 - temp)*back_img.at<Vec4b>(i, j)[0] + temp * img.at<Vec4b>(i, j)[0];
mat.at<Vec4b>(i, j)[1] = (1 - temp)*back_img.at<Vec4b>(i, j)[1] + temp * img.at<Vec4b>(i, j)[1];
mat.at<Vec4b>(i, j)[2] = (1 - temp)*back_img.at<Vec4b>(i, j)[2] + temp * img.at<Vec4b>(i, j)[2];
mat.at<Vec4b>(i, j)[3] = (1 - temp)*back_img.at<Vec4b>(i, j)[3] + temp * img.at<Vec4b>(i, j)[3];
}
}
namedWindow("alpha混合图像");
imshow("alpha混合图像", mat);
waitKey();
return 0;
}
网友评论