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;
}
原图