OpenCV让ROI区域透明

#include 
#include 
using namespace cv;

#define WINDOW_NAME "【透明图】"        

const int g_nMaxAlphaValue = 100;//Alpha值的最大值
int g_nAlphaValueSlider;//滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;

//声明存储图像的变量
Mat g_srcImage1,g_srcImage2,g_dstImage,ROIImage, ROIImage1,clone_Image, gray_Image;

//滑动条响应函数
void on_Trackbar()
{
	//求出当前alpha值相对于最大值的比例
	g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;
	//则beta值为1减去alpha值
	g_dBetaValue = (1.0 - g_dAlphaValue);

	//根据alpha和beta值进行线性混合
	addWeighted(g_srcImage2, g_dAlphaValue, ROIImage, g_dBetaValue, 0.0, g_dstImage);//g_dAlphaValue:图片1的权重,g_dBetaValue:图片2的
}

//像素处理函数
Mat Pixel(Mat img)
{
	for (int i = 0;i < img.rows;i++)
	{
		for (int j = 0;j < img.cols;j++)
		{
			img.at(i, j)[0] = 255;
			img.at(i, j)[1] = 0;
			img.at(i, j)[2] = 0;
		}
	}
	return img;
}

//--------------------------------------【main( )函数】-----------------------------------------
//		描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{
	//加载图像 (两图像的尺寸需相同)
	g_srcImage1 = imread("2.jpg");
	g_srcImage2 = imread("3.jpg");
	g_nAlphaValueSlider = 100;
	if (!g_srcImage1.data)
	{
		printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n");
		return -1;
	}
	if (!g_srcImage2.data)
	{
		printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n");
		return -1;
	}

	Pixel(g_srcImage2);//处理像素

	ROIImage = g_srcImage1(Rect(50,50, g_srcImage2.cols, g_srcImage2.rows));
	ROIImage1 = g_srcImage1(Rect(50, 50, g_srcImage2.cols, g_srcImage2.rows));

	namedWindow(WINDOW_NAME, 1);
	g_nAlphaValueSlider = 30;
	
	on_Trackbar();
	//imshow("【clone_Image】", g_dstImage);
	clone_Image=g_dstImage.clone();
	cvtColor(clone_Image, gray_Image,CV_RGB2GRAY);
	Mat mask = gray_Image;
	clone_Image.copyTo(ROIImage1,mask);
	imshow(WINDOW_NAME, g_srcImage1);

	//按任意键退出
	waitKey(0);
	return 0;
}

你可能感兴趣的:(开发语言)