前两篇博文分别介绍了图像的边缘检测和轮廓检测,本文接着介绍图像的轮廓检测和轮廓外接矩形:
一、代码部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
// extract_contours.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<cv.h>
#include<highgui.h>
using namespace cv;
using namespace std;
int _tmain( int argc, _TCHAR* argv[])
{
//load src image
string img_name= "..\\image_norm\\71253.jpg" ;
Mat image=imread(img_name);
imshow( "src_image" ,image);
cvWaitKey(0);
//convert into gray image
Mat gray(image.size(),CV_8U);
cvtColor(image,gray,CV_BGR2GRAY);
imshow( "gray" ,gray);
cvWaitKey(0);
//convert into bin image
threshold(gray,gray,128,255,THRESH_BINARY); //转换成2值图像
imshow( "binary" ,gray);
cvWaitKey(0);
// Detecting contours
vector<vector<Point>> contours; //定义轮廓集合
vector<Vec4i> hierarchy;
findContours(gray, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //CV_RETR_EXTERNAL只检测外部轮廓
// draw black contours on white image
Mat result(gray.size(),CV_8U,Scalar(255));
int index = 0;
for (; index >= 0; index = hierarchy[index][0]) //hierarchy[index][0]表示后一个轮廓
{
Scalar color( rand () & 255, rand () & 255, rand () & 255);
drawContours(result, contours, index, Scalar(0), 1, 8, hierarchy); //描绘字符的外轮廓
Rect rect = boundingRect(contours[index]); //检测外轮廓
rectangle(result, rect, Scalar(0,0,255), 3); //对外轮廓加矩形框
}
imshow( "Contours on white image" ,result);
cvWaitKey(0);
//draw contours on the original image
Mat original=imread(img_name);
int index_ori = 0;
for (; index_ori >= 0; index_ori = hierarchy[index_ori][0])
{
Scalar color( rand () & 255, rand () & 255, rand () & 255);
//描绘字符的外轮廓
drawContours(original,contours,index_ori,Scalar(255),1,8, hierarchy);
Rect rect = boundingRect(contours[index_ori]); //检测外轮廓
//对外轮廓加加矩形框
rectangle(original, rect, Scalar(0,0,255), 3);
}
//print contours info
cout<< "The number of external contours:" <<contours.size()<<endl;
imshow( "Contours on original image" ,original);
waitKey(0);
return 0;
}
|
二、程序运行效果图:
(1)源图像:
(2)灰度图像:
(3)二进制图像:
(4)轮廓在空白图像上显示:
(5)在原图像上画出图像的轮廓以及外接矩形:
至此,图像的轮廓检测以及外接矩形已经实现,欢迎高人指正。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/lindamtd/article/details/75194762