#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
今日推荐
周排行