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

来源:互联网 发布:淘宝天猫电器城 编辑:程序博客网 时间:2024/05/22 09:22

这次我写的是轨迹条创建和使用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.

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

第一次运行后的结果

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

程序错误图片

将空格去掉就可以了。
去掉多的空格后的图片

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

图potted-plant权重位20

图potted-plant权重位70

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

多空格程序
去掉空格后的程序

最终改正后的运行结果:
最终理想结果

我的所有程序代码如下:

#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);}

从上面我的错误可以看出,学程序不仅需要勤于思考,勤于动手,还要细心啊!不然会吃亏的!

原创粉丝点击