如何设置感兴趣的区域ROI

一、定义: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;
}

三、运行结果

如何设置感兴趣的区域ROI_第1张图片

两幅图片叠加上去时,其透明度是可以改变的,用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等大。
如何设置感兴趣的区域ROI_第2张图片




 
  
 
 

你可能感兴趣的:(Opencv常用函数介绍)