Alpha线性混合实现半透明效果

遇到的问题

1.opencv的trackbarName有一些bug,传值string时会出现显示不正常的问题
2.指向函数的指针的用法是 返回类型 (*名称)(参数列表),如createTrackbar的第五个参数onChange(),数据类型为TrackbarCallback,官方文档给出的定义为typedef void(* cv::TrackbarCallback) (int pos, void *userdata),
表示指向形式为void f(int pos,void *userdata)的函数
3.userdata相当于事件处理函数中的EventArg参数,用来传递一些数据。

实现代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

const int MaxAlphaValue = 100;
const string WindowName = "Alpha线性混合实现半透明效果";

Mat srcImage1,srcImage2,dstImage;
int alphaValue = 70;

void error(const char *errorString) 
{
	cout << errorString << endl;
}
void onChange(int pos,void *userData)
{
	double dAlpha = (double)alphaValue/MaxAlphaValue;
	double dBeta = 1 - dAlpha;
	addWeighted(srcImage1,dAlpha,srcImage2,dBeta,0,dstImage);
	imshow(WindowName,dstImage);
}
int main()
{
	srcImage1 = imread("flower.jpg");
	srcImage2 = imread("leaf.jpg");
	if(!srcImage1.data || !srcImage2.data) 
	{
		error("flower.jpg or leaf.jpg not found!\n");
		return -1;
	}
	//默认的WINDOW_AUTOSIZE不能手动调整窗口大小,设置为WINDOW_NORMAL可以手动调整
	namedWindow(WindowName,WINDOW_NORMAL);
	//opencv在设置trackbarName这里有bug
	//代码若写成string trackbarName = "transparent value " + MaxAlphaValue;
	//会出现trackbarName显示不正常的问题
	char trackbarName[50];
	sprintf(trackbarName,"透明值 %d",MaxAlphaValue);
	//string trackbarName = "xxx " + MaxAlphaValue;
	createTrackbar(trackbarName,WindowName,&alphaValue,MaxAlphaValue,onChange,NULL);
	onChange(alphaValue,NULL);
	waitKey(0);
    return 0;
}

原图


效果图

posted @ 2018-07-17 18:01  技术流选手  阅读(718)  评论(0编辑  收藏  举报