opencv函数操作对象的一致性问题

初衷:

读入一幅图像“woman.jpg”

在图像的红色通道中加入logo,再输出。

logo的文件名为"logo.jpg"


------------------------------------------codes begin----------------------------------------------------

#include <opencv2\core\core.hpp>

#include<opencv2\highgui\highgui.hpp>

#include <iostream>

#include <string>

using namespace cv;

using namespace std;


int main(int argc, char **argv)

{

        Mat woman = imread("woman.jpg");

        Mat logo= imread("logo.jpg");

        Mat ROI;

vector<Mat> channels;
Mat womanR;

namedWindow("woman");
imshow("woman",woman);


        namedWindow("logo");
imshow("logo",logo);



split(woman, channels);
womanR = channels.at(0);



ROI = womanR(Rect(100, 100, logo.cols,logo.rows));
addWeighted(ROI,0.5,logo,0.5,0.,ROI);
merge(channels,woman);
namedWindow("womanR+logo");
imshow("womanR+logo",woman);


        waitKey(0);

         return(0);

}//end of main

------------------------------------------codes end-------------------------------------------------------

第一次运行的时候,在函数addWeighted()处报错。

原因:logo.jpg是读入的三通道图像,而ROI此时是woman.jpg的红色通道数据。

修改方法:

将主函数的第二句代码

        Mat logo= imread("logo.jpg");

修改成

        Mat logo= imread("logo.jpg",0);

第二次运行,结果正确。


几次运用openCV的结论:

opencv对图像的操作,实际是对矩阵数据的操作,和matlab对图像的操作有类似之处。

因此无论是从数据通道(单通道或多通道)还是维数(尺寸)上,两个参与操作的对象要注意一致。

例如code中的两句代码:

ROI = womanR(Rect(100, 100, logo.cols,logo.rows));
addWeighted(ROI,0.5,logo,0.5,0.,ROI);

第一句也是为了得到在woman.jpg红色通道数据中和logo一样尺寸的感兴趣区域变量ROI,否则在addWeighted()函数在执行时也会出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值