您的位置:首页 > 运维架构

初学opencv遇到的问题及解决办法(2)

2017-10-18 13:39 295 查看
这次我写的是轨迹条创建和使用createTrackerbar编程过程中遇到的问题。

先介绍一下createTrackerbar():

CV_EXPORTS int createTrackbar(const string& trackbarname,
const string& winname,
int* value,
int count,
TrackbarCallback onChange=0,
void* userdata=0);
部分参数意义:
int* value:创建滑动条时,滑动条的初始值;
int count:滑动条的最大值;
TrackbarCallback onChange=0:回调函数;
void* userdata=0    :用户传给回调函数的数据,用来处理滑动条数值的变动。若在创建滑动条时,输入的value实参是全局变量,则可默认使用userdata=0.


我想将两张图片混合并将图像混合时的权重调节用滑动条来表示,可是第一次运行出错了,没有出现滑动条窗口,结果如下:



然后我找了两个小时左右,终于找到了问题所在,如下图:



将空格去掉就可以了。



本来以为这样就好了,但和我想得不一样。去掉那个空格后运行结果虽然有滑动条,而且也可以调节,但是不在“一张图片上”,那错了?





没错,又是空格!我真的无语了!





最终改正后的运行结果:



我的所有程序代码如下:

#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

const int Trackbar_value_MAX=100;
int Trackbar_value;//滑动条对应的值
double alpha_value, beta_value;//分别为第一幅,第二幅图的权重
Mat srcImage1,srcImage2,dstImage ;

void onTrackbar(int, void*);//声名回调函数

int main()
{
Mat srcImage11, srcImage22;
srcImage11 = imread("potted-plant.jpg");
srcImage22 = imread("girl.jpg");
// imshow("srcImage11" ,srcImage11);
// imshow(" srcImage22", srcImage22);
resize(srcImage11, srcImage1, Size(srcImage11.cols / 1.8, srcImage11.rows / 1.8));//压缩图片到合适大小,原图太大了
imshow("potted-plant", srcImage1);
resize(srcImage22, srcImage2, Size(srcImage22.cols / 1.8, srcImage22.rows / 1.8));
imshow("girl", srcImage2);
//判断图片是否加载成功
if (srcImage1.empty() || srcImage2.empty())
{
cout << "to load failed!" << endl;
return -1;
}
else
cout << "to load successfully!" << endl;

namedWindow("混合后的图像", WINDOW_AUTOSIZE);
Trackbar_value = 20;//滑动条初始值
//在创建的窗体中创建滑动条控件并且命名
char TrackBarName[100];
sprintf_s(TrackBarName, "透明度 %d", Trackbar_value_MAX);
createTrackbar(TrackBarName, "混合后的图像", &Trackbar_value, Trackbar_value_MAX, onTrackbar);
onTrackbar(Trackbar_value, 0);
waitKey(0);
return 0;
}

void onTrackbar(int,void*)
{
alpha_value = (double)Trackbar_value / Trackbar_value_MAX;
beta_value = 1.0 - alpha_value;
addWeighted(srcImage1, alpha_value, srcImage2, beta_value, 0.0, dstImage);
imshow("混合后的图像", dstImage);
}


从上面我的错误可以看出,学程序不仅需要勤于思考,勤于动手,还要细心啊!不然会吃亏的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv