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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值