生成透明通道及写出
#include <vector>
#include <stdio.h>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//--------------------------------【createAlphaMat( )函数】--------------------------------
// 描述:创建带alpha通道的Mat
//-------------------------------------------------------------------------------------------------
void createAlphaMat(Mat &mat){
for(int i = 0; i < mat.rows; ++i) {
for(int j = 0; j < mat.cols; ++j) {
Vec4b&rgba = mat.at<Vec4b>(i, j);
rgba[0]= UCHAR_MAX;
rgba[1]= saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) *UCHAR_MAX);
rgba[2]= saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) *UCHAR_MAX);
rgba[3]= saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
}
}
}
int main( ){
Mat mat(480, 640, CV_8UC4);//创建矩阵,四个channel,每个通道有八个位
createAlphaMat(mat);//创建带alpha通道的Mat
vector<int>compression_params;//压缩参数
compression_params.push_back(IMWRITE_PNG_COMPRESSION);//PNG格式
compression_params.push_back(9);//质量是9,就是最高
try{//显示图片
imwrite("透明Alpha值图.png", mat, compression_params);//把图读入到MAT,第三个参数是传入的类型及质量
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;
}
//读图与显图
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main( ){
Mat girl=imread("girl.jpg"); //载入图像到Mat
namedWindow("【1】动漫图"); //创建一个名为 "【1】动漫图"的窗口
imshow("【1】动漫图",girl);//显示名为 "【1】动漫图"的窗口
Mat image= imread("dota.jpg");//载入图片
Mat logo= imread("dota_logo.jpg");//载入图片
namedWindow("【2】原画图");//开窗口
imshow("【2】原画图",image);//显示
namedWindow("【3】logo图");//开窗口
imshow("【3】logo图",logo);//显示
Mat imageROI;// 定义一个Mat类型,用于存放图像的ROI,特别注意这里不是copy,roi指向的元素就是logo里面的
imageROI= image(Rect(800,350,logo.cols,logo.rows));//方法一,四个参数,左上角的坐标,还有X,Y轴的范围
//imageROI= image(Range(350,350+logo.rows),Range(800,800+logo.cols));//方法二,两个范围参数表示X,Y轴的坐标范围
addWeighted(imageROI,0.5,logo,0.3,0.,imageROI);// 将logo线性加到原图上
namedWindow("【4】原画+logo图");//开窗口
imshow("【4】原画+logo图",image);//显示结果
imwrite("由imwrite生成的图片.jpg",image);//输出一张jpg图片到工程目录下
waitKey();
return 0;
}
滑动条
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#define WINDOW_NAME "【滑动条的创建&线性混合示例】"//为窗口标题定义的宏
const int g_nMaxAlphaValue = 100;//Alpha值的最大值
int g_nAlphaValueSlider;//滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;
Mat g_srcImage1;//入图一
Mat g_srcImage2;//入图二
Mat g_dstImage;//出图
//-----------------------------------【on_Trackbar( )函数】--------------------------------
// 描述:响应滑动条的回调函数
//------------------------------------------------------------------------------------------
void on_Trackbar( int, void* ){//每次滑块被拖动都会执行此函数
g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue ;//求出当前alpha值相对于最大值的比例
g_dBetaValue = ( 1.0 - g_dAlphaValue );//则beta值为1减去alpha值
addWeighted( g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);//根据alpha和beta值进行线性混合
imshow( WINDOW_NAME, g_dstImage );//显示效果图
}
int main( int argc, char** argv ){
g_srcImage1 = imread("1.jpg");//加载图像 (两图像的尺寸需相同)
g_srcImage2 = imread("2.jpg");//加载图像 (两图像的尺寸需相同)
if( !g_srcImage1.data ) { printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return -1; }
if( !g_srcImage2.data ) { printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n"); return -1; }
g_nAlphaValueSlider = 70;//设置滑动条初值为70
namedWindow(WINDOW_NAME, 1);//创建窗体
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;
}