一、定义:ROI区域有两种算法,第一种是表示矩形区域的Rect区域,它指定矩形的左上角坐标和矩形的长和宽;另一个函数是Range,它是从起始索引到终止索引(不包括终止索引)的一段连续区域,我感觉就是矩形行数的范围和猎术范围叠加起来而形成的一个矩阵,从而定义一个矩形区域。
方法一:
Rect函数:
rect(x -> cols, y -> rows, width -> cols, height -> rows)
Mat image,logo,imageROI;
imageROI=image(Rect(20,30,logo.clos,logo.rows));
方法二:
Range函数:Mat image,logo,imageROI;
imageROI=image(range(20,20+logo.rows),range(30,30+logo.clos));
顺便讲一下addWeighted()函数,因为下面的程序要用到的:
void(InputArray src1,double alpha,InputArray src2,double beta,double gamma,OutputArray dst,int dtype)
第一个参数是输入一个矩阵图1,第二个参数是矩阵图1 的权值;
第三个参数是输入一个矩阵图2,第四个参数是矩阵图2 的权值;
第五个参数是加权到权重总和上的标量;
第六个参数是输出矩阵图;
第八个参数是输出阵列的深度,当两个输入矩阵图具有相同的深度时,等于-1;
后面我会针对此函数专写一个程序。
二、整合在一起的完整代码
#include
//#include
//#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("D:\\vvoo\\32.jpg");
Mat logaImage = imread("D:\\vvoo\\shark.jpg");
//此为Rect函数
//Mat imageROI = srcImage(Rect(400, 200, logaImage.cols, logaImage.rows));
//此为Range函数
Mat imageROI = srcImage(Range(200,200 + logaImage.rows),Range(600, 600 + logaImage.cols));
addWeighted(imageROI, 0.3, logaImage, 1, 0.,imageROI);
imshow("区域线性混合", srcImage);
while (char(waitKey(1))!= 'q') //退出程序
{
}
waitKey(0);
return true;
}
三、运行结果
两幅图片叠加上去时,其透明度是可以改变的,用addWeighted()的权值参数修改即可。四、在实际项目中,很多情况是寻找不规则形状,那么上面的两个函数就有局限性了,对此来介绍画多边形函数ploylines()与填充函数fillPoly()。2017.06.07(改)
C++: void polylines(Mat& img,
const Point** pts, const int* npts, int ncontours, bool isClosed,
const Scalar& color, int thickness=1, int lineType=8, int shift=0 )
C++: void polylines(InputOutputArray img, InputArrayOfArrays pts,
bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )
Parameters:
img – 折线所在图像.
pts – 折线中拐点坐标指针.
npts – 折线拐点个数指针.
ncontours – 折线线段数量.
isClosed – 折线是否闭合.
color – 折线颜色.
thickness – 折线宽度.
lineType – 线型.
shift – 顶点坐标小数点位数.
对于创建固定显示窗口:
cvNamedWindow("enhanced",0); cvResizeWindow("enhanced", 640, 480); cv::imshow("enhanced", betterI)
创建窗口时候改变下参数就可以鼠标随意拖动窗口改变大小啦~
cv::namedWindow("camera", CV_WINDOW_NORMAL); cv::imshow("camera", frame);
#include "stdafx.h"
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("D://vvoo//lena.jpg");
namedWindow("roiImg",0);
cvResizeWindow("roiImg",95,55);
Point root_points[1][4];
root_points[0][0] = Point(5,5);
root_points[0][1] = Point(30,100);
root_points[0][2] = Point(60,100);
root_points[0][3] = Point(35,5);
const Point* ppt[1] = {root_points[0]};
int npt[] = {4};
polylines(img, ppt, npt, 1, 1, Scalar(255),1,8,0); fillPoly(img, ppt, npt, 1, Scalar(255,255,0));
Rect roi=Rect(Point(5,5), Point(60,100));
Mat roiImg=img(roi);cout<
但是我不会弄显示的窗口和画的roi等大。