您的位置:首页 > 理论基础

OpenCV2计算机视觉应用编程手册(自学版)初级五

2014-11-30 00:49 501 查看
OpenCV2计算机视觉应用编程手册(自学版)初级五

---图像叠加、图像三个通道的分解和合成、图像ROI区域操作

/*

第五个opencv程序---图像叠加、图像三个通道的分解和合成、图像ROI区域操作

时间:2014年11月30日00:50:14

要叠加的两个图像,必须保证有着相同的大小和相同的数据类型

对单个图像进行操作的运算符包括

sqrt pow abs cuberoot exp log

矩阵加法操作

1--cv::addWeighted(image1,0.7,image2,0.9,0.,result);// 直接调用系统函数

2---result= 0.7*image1+0.9*image2;// +运算符被重载了

对RGB通道数据分别处理

将RGB三通道图像分解成个单通道数据,这样就可以分别对单个通道进行处理

cv::split(image1,planes);// 将个三通道的数据分成个单通道的数据

将三个单通道合并成1个三通道数据

cv::merge(planes,result);//重新将三个通道的图像整成个三通道的图像

ROI--region of interest 感兴趣的区域

ROI 区域声明

cv::Mat imageROI;

imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));//前两个是对应添加的ROI的左上角坐标

*/

#include "stdafx.h"

#include<iostream>

#include <opencv2/opencv.hpp>

using namespace std;// 使用STD

using namespace cv;// 使用名字空间

int main()

{

cv::Mat image1;

cv::Mat image2;

image1= cv::imread("F:\\house.jpg");

image2= cv::imread("F:\\rain.jpg");

if (!image1.data)

return 0;

if (!image2.data)

return 0;

cv::namedWindow("Image 1");

cv::imshow("Image 1",image1);

cv::namedWindow("Image 2");

cv::imshow("Image 2",image2);



cv::Mat result;

cv::addWeighted(image1,0.7,image2,0.9,0.,result);// 直接调用系统函数

cv::namedWindow("result");

cv::imshow("result",result);

// using overloaded operator 使用运算符重载

result= 0.7*image1+0.9*image2;

cv::namedWindow("result with operators");

cv::imshow("result with operators",result);// 运算符重载了

image2= cv::imread("F:\\rain.jpg",0);

// create vector of 3 images

std::vector<cv::Mat> planes;

// split 1 3-channel image into 3 1-channel images

cv::split(image1,planes);// 将个三通道的数据分成个单通道的数据

// add to blue channel



planes[0]+= image2;// 在蓝色通道上面加上rain

// merge the 3 1-channel images into 1 3-channel image

cv::merge(planes,result);//重新将三个通道的图像整成个三通道的图像



cv::namedWindow("Result on blue channel");

cv::imshow("Result on blue channel",result);

// ROI =region of interst

// read images

cv::Mat image= cv::imread("F:\\house.jpg");

cv::Mat logo= cv::imread("F:\\logo.bmp");

// define image ROI

cv::Mat imageROI;

imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));

// add logo to image

cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);// imageROI区域=imageROI+0.3*logo+0.0

// show result

cv::namedWindow("with logo");

cv::imshow("with logo",image);

// read images

image= cv::imread("F:\\house.jpg");

logo= cv::imread("F\\logo.bmp");

// define ROI

imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));// 定义ROI区域

// load the mask (must be gray-level)

cv::Mat mask= cv::imread("F:\\logo.bmp",0);

// copy to ROI with mask

logo.copyTo(imageROI,mask);



// show result

cv::namedWindow("with logo 2");

cv::imshow("with logo 2",image);

// 对三个通道进行处理将LOGO嵌入到某个通道中

// read images

logo= cv::imread("F:\\logo.bmp",0);

image1= cv::imread("F:\\house.jpg");

// split 3-channel image into 3 1-channel images

std::vector<cv::Mat> channels;

cv::split(image1,channels);

imageROI= channels.at(1);

cv::addWeighted(imageROI(cv::Rect(385,270,logo.cols,logo.rows)),1.0,

logo,0.5,0.,imageROI(cv::Rect(385,270,logo.cols,logo.rows)));

cv::merge(channels,image1);

cv::namedWindow("with logo 3");

cv::imshow("with logo 3",image1);

cv::waitKey();

return 0;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: