创建ROI的几种方法:
- Mat ROIimage = image(cv::Rect(385,270,logo.cols,logo.rows));
- Mat ROIimage = image(cv::Range(270,270+log.rows),cv::Range(385,385+log.cols));
- Mat ROIimage = image.rowRange(start,end);
- Mat ROIimage = image.colRange(start,end);
利用ROI(感兴趣区域)给图片加水印;
ROI被当做一个普通的Mat实例来处理,不过关键之处在于,ROI和父图像指向同一块内存区域。
实现代码如下:
#include "stdafx.h"
#include <opencv2/opencv.hpp>
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
Mat image = imread("F:\\VS2010workplace\\cvTestLoge\\cvTestLoge\\boldt.jpg");
Mat logo = imread("F:\\VS2010workplace\\cvTestLoge\\cvTestLoge\\logo.bmp");
Mat ROIimage = image(cv::Rect(385,270,logo.cols,logo.rows));
logo.copyTo(ROIimage);
namedWindow("logo");
imshow("logo",image);
waitKey(0);
return 0;
}
此程序运行结果如下:
使用掩模来处理,代码如下:
#include "stdafx.h"
#include <opencv2/opencv.hpp>
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
Mat image = imread("F:\\VS2010workplace\\cvTestLoge\\cvTestLoge\\boldt.jpg");
Mat logo = imread("F:\\VS2010workplace\\cvTestLoge\\cvTestLoge\\logo.bmp");
Mat ROIimage = image(cv::Rect(385,270,logo.cols,logo.rows));
Mat mask = imread("F:\\VS2010workplace\\cvTestLoge\\cvTestLoge\\logo.bmp",0);
logo.copyTo(ROIimage,mask);
namedWindow("logo");
imshow("logo",image);
waitKey(0);
return 0;
}
效果如下:
Mat mask = imread("F:\\VS2010workplace\\cvTestLoge\\cvTestLoge\\logo.bmp",0);
掩模必须是灰度图,imread第二个参数设置为0;
直接相加处理,代码如下:
#include "stdafx.h"
#include <opencv2/opencv.hpp>
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
Mat image = imread("F:\\VS2010workplace\\cvTestLoge\\cvTestLoge\\boldt.jpg");
Mat logo = imread("F:\\VS2010workplace\\cvTestLoge\\cvTestLoge\\logo.bmp");
Mat ROIimage = image(cv::Rect(385,270,logo.cols,logo.rows));
//Mat mask = imread("F:\\VS2010workplace\\cvTestLoge\\cvTestLoge\\logo.bmp",0);
//logo.copyTo(ROIimage,mask);
addWeighted(ROIimage,1.0,logo,0.7,0,ROIimage);
namedWindow("logo");
imshow("logo",image);
waitKey(0);
return 0;
}
运行效果: