感兴趣区域选取与检测并画出包围框

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

using namespace std;
using namespace cv;
int main()
{
	Mat srcImage, dstImage, imageROI, drawing,ROI;
	srcImage = imread("H:\\test\\VS2015_projects\\NG PIC\\18点24分19秒976毫秒.tif");

	ROI = srcImage(Rect(0.3*srcImage.cols, 50, 0.4*srcImage.cols, srcImage.rows - 100));  //定义ROI
	ROI.copyTo(imageROI);

	Mat ROI_gray, ROI_bw, ROI_proc;
	cvtColor(imageROI, ROI_gray, CV_BGR2GRAY);
	blur(ROI_gray, ROI_gray, Size(5, 5));
	threshold(ROI_gray, ROI_bw, 100, 255, THRESH_BINARY);
	namedWindow("bw", WINDOW_NORMAL);
	imshow("bw", ROI_bw);

	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;

	//找到轮廓点
	findContours(ROI_bw, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
	vector<Rect> boundRect(contours.size());  //定义外接矩形集合

	for (int i = 0; i < contours.size(); i++)
	{
		drawContours(imageROI, contours, i, Scalar(0,0,255), 1, 8);

		//返回Rect类矩形对象,输入二维点集,可以填Mat类型或std::vector
		boundRect[i] = boundingRect(Mat(contours[i]));

		//丢弃非常小的矩形
		if (boundRect[i].width < 50 || boundRect[i].height < 50 || boundRect[i].area()<10000)
			continue;
		
		//丢弃宽高比过小的矩形
		double proportion = boundRect[i].width / boundRect[i].height;
		if (proportion < 5)
			continue;

		//画出包围矩形,rect.tl(),返回rect的左上定点坐标,rect.br()右上顶点。
		rectangle(imageROI,boundRect[i].tl(), boundRect[i].br(), Scalar(0, 0, 255), 2, 8, 0);
		Mat logo;
		imageROI.copyTo(ROI);

	}
	namedWindow("Rect", WINDOW_NORMAL);
	imshow("Rect", imageROI);
	namedWindow("res", WINDOW_NORMAL);
	imshow("res", srcImage);

	waitKey(0);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/csdn330/article/details/80073927
今日推荐