opencv第三章

生成透明通道及写出
#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;
}

猜你喜欢

转载自blog.csdn.net/cj1064789374/article/details/88084999
今日推荐