opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

一、简介

二、外接矩形的查找绘制

 1 #include "opencv2/opencv.hpp"
 2 using namespace cv;
 3 void main()
 4 {
 5     //外接矩形的查找绘制
 6     Mat srcImg =imread("E://12.jpg");
 7     imshow("src",srcImg);
 8     Mat dstImg = srcImg.clone();  //原图备份
 9     cvtColor(srcImg, srcImg, CV_BGR2GRAY); //转为灰度图
10     threshold(srcImg, srcImg, 100, 255, CV_THRESH_BINARY); //二值化
11
12     vector<vector<Point>> contours;
13     vector<Vec4i> hierarcy;
14     findContours(srcImg, contours, hierarcy, CV_RETR_EXTERNAL, CHAIN_APPROX_NONE); //查找轮廓
15     vector<Rect> boundRect(contours.size()); //定义外接矩形集合
16     //drawContours(dstImg, contours, -1, Scalar(0, 0, 255), 2, 8);  //绘制轮廓
17     int x0=0, y0=0, w0=0, h0=0;
18     for(int i=0; i<contours.size(); i++)
19     {
20         boundRect[i] = boundingRect((Mat)contours[i]); //查找每个轮廓的外接矩形
21         drawContours(dstImg, contours, i, Scalar(0, 0, 255), 2, 8);  //绘制轮廓
22         x0 = boundRect[i].x;  //获得第i个外接矩形的左上角的x坐标
23         y0 = boundRect[i].y; //获得第i个外接矩形的左上角的y坐标
24         w0 = boundRect[i].width; //获得第i个外接矩形的宽度
25         h0 = boundRect[i].height; //获得第i个外接矩形的高度
26         rectangle(dstImg, Point(x0, y0), Point(x0+w0, y0+h0), Scalar(0, 255, 0), 2, 8); //绘制第i个外接矩形
27     }
28     imshow("boundRect", dstImg);
29     waitKey(0);
30 }

三、分割硬币轮廓并计数

 1 #include "opencv2/opencv.hpp"
 2 #include<iostream>
 3 using namespace cv;
 4 using namespace std;
 5 void main()
 6 {
 7     //分割硬币轮廓
 8     Mat srcImg =imread("E://33.png");
 9     imshow("src", srcImg);
10     Mat dstImg = srcImg.clone();  //原图备份
11     cvtColor(srcImg, srcImg, CV_BGR2GRAY); //转为灰度图
12     threshold(srcImg, srcImg, 100, 255, CV_THRESH_BINARY); //二值化
13     Mat element = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1)); //获得结构元素
14     dilate(srcImg, srcImg, element); //膨胀操作
15     imshow("dilate",srcImg);
16
17     vector<vector<Point>> contours;
18     vector<Vec4i> hierarcy;
19     findContours(srcImg, contours, hierarcy, CV_RETR_EXTERNAL, CHAIN_APPROX_NONE); //查找轮廓
20     vector<Rect> boundRect(contours.size()); //定义外接矩形集合
21     int x0=0, y0=0, w0=0, h0=0,num=0;
22     for(int i=0; i<contours.size(); i++)
23     {
24         boundRect[i] = boundingRect((Mat)contours[i]); //查找每个轮廓的外接矩形
25         drawContours(dstImg, contours, i, Scalar(0, 0, 255), 2, 8);  //绘制轮廓
26         x0 = boundRect[i].x;
27         y0 = boundRect[i].y;
28         w0 = boundRect[i].width;
29         h0 = boundRect[i].height;
30         if(w0>30 && h0>30)//筛选
31         {
32             rectangle(dstImg, Point(x0, y0), Point(x0+w0, y0+h0), Scalar(0, 255, 0), 2, 8); //绘制第i个外接矩形
33             num++;
34         }
35     }
36     cout<<"硬币数量:"<<num;
37     imshow("boundRect", dstImg);
38     waitKey(0);
39 }

四、简单车牌字符分隔

 1 #include "opencv2/opencv.hpp"
 2 using namespace cv;
 3 void main()
 4 {
 5     //---简单车牌字符分隔
 6     Mat srcImg =imread("E://Car2.jpg");
 7     Mat dstImg = srcImg.clone();  //原图备份
 8     medianBlur(srcImg, srcImg, 5);  //中值滤波
 9     cvtColor(srcImg, srcImg, CV_BGR2GRAY); //转为灰度图
10     threshold(srcImg, srcImg, 100, 255, CV_THRESH_BINARY); //二值化
11     imshow("threshold", srcImg);
12     imwrite("F://car0.jpg", srcImg);
13
14     vector<vector<Point>> contours;
15     vector<Vec4i> hierarcy;
16     findContours(srcImg, contours, hierarcy, CV_RETR_TREE, CHAIN_APPROX_NONE); //查找所有轮廓
17     vector<Rect> boundRect(contours.size()); //定义外接矩形集合
18     int x0=0, y0=0, w0=0, h0=0;
19     for(int i=0; i<contours.size(); i++)
20     {
21         boundRect[i] = boundingRect((Mat)contours[i]); //查找每个轮廓的外接矩形
22         x0 = boundRect[i].x;
23         y0 = boundRect[i].y;
24         w0 = boundRect[i].width;
25         h0 = boundRect[i].height;
26         if(w0>srcImg.cols/12 && w0<srcImg.cols/5 && h0>srcImg.rows/6 && h0<srcImg.rows*5/6)
27         {
28             char pic_name[10];
29             sprintf(pic_name, "F:\\%d.bmp", i);
30             Mat ROI = dstImg(Rect(x0, y0, w0, h0));
31             imwrite(pic_name, ROI);
32             rectangle(dstImg, Point(x0, y0), Point(x0+w0, y0+h0), Scalar(0, 255, 0), 2, 8); //绘制第i个外接矩形
33         }
34     }
35     imshow("boundRect", dstImg);
36     waitKey(0);
37 }

时间: 2024-10-21 10:21:10

opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形的相关文章

opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形

一.简介 二.轮廓最小外接矩形的绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 4 void main() 5 { 6 //轮廓最小外接矩形的绘制 7 Mat srcImg = imread("E://00.png"); 8 Mat dstImg = srcImg.clone(); 9 cvtColor(srcImg, srcImg, CV_BGR2GRAY); 10 threshold(srcI

26、【opencv入门】轮廓查找与绘制(4)——正外接矩形

一.简介 1.使用特定形状的轮廓包围 在实际应用中, 经常会有将检测到的轮廓用多边形表示出来的需求, 提取包围轮廓的多边形也方便我们做进一步分析, 轮廓包围主要有一下几种: 轮廓外接矩形.轮廓最小外接矩形(旋转).轮廓最小包围圆形.轮廓拟合椭圆.轮廓逼近多边形曲线 2.轮廓外接矩形 --- boundingRect() 1 CV_EXPORTS_W Rect boundingRect(InputArray points); points: 输入的二维点集, 可以填Mat类型或std::vecto

30、【opencv入门】轮廓查找与绘制(8)——轮廓特征属性及应用

一.简介 1.HSV颜色空间(hue色调,saturation饱和度,value亮度) HSV颜色空间与人眼所看色彩较接近, 故常用于颜色检测与识别.其中H(色调).S(饱和度).V(亮度) H---不同的颜色(红色/绿色/蓝色)---范围: 0~360 S---颜色深浅(浅红/深红)---范围: 0.0~1.0 V---颜色亮暗(暗红/亮红)---范围: 0.0~1.0 OpenCV默认的HSV范围分别是: H: 0~180,  S: 0~255,  V: 0~255 2.相关知识点 颜色空间

opencv学习之路(24)、轮廓查找与绘制(三)——凸包

一.简介 二.绘制点集的凸包 1 #include<opencv2/opencv.hpp> 2 using namespace cv; 3 4 void main() 5 { 6 //---绘制点集的凸包 7 Mat img(400, 400, CV_8UC3, Scalar::all(0)); //定义绘制图像 8 RNG rng; //定义随机数对象 9 while(1) 10 { 11 char key; 12 int count = (unsigned int)rng % 100; /

opencv学习之路(27)、轮廓查找与绘制(六)——外接圆

一.最小外接圆 1 #include "opencv2/opencv.hpp" 2 #include<iostream> 3 using namespace std; 4 using namespace cv; 5 6 void main() { 7 Mat srcImg = imread("E://10.png"); 8 imshow("src", srcImg); 9 Mat dstImg = srcImg.clone(); 10

25、【opencv入门】轮廓查找与绘制(3)——凸包

一简介 1.凸包 凸包(Convex Hull)是一个计算机几何图形学中的概念, 简单来说, 给定二维平面点集, 凸包就是能够将最外层的点连接起来构成的凸多边形, 它能够包含点集中所有的点.物体的凸包检测场应用在物体识别.手势识别及边界检测等领域. A-H是被标出的凸包缺陷 2.寻找凸包---convexHull() 1 CV_EXPORTS_W void convexHull(InputArray points, OutputArray hull, bool clockwise=false,

OpenCV学习代码记录—— Snake轮廓

很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/legac

opencv学习之路(21)、模板匹配及应用

一.模板匹配概念 二.单模板匹配 1 #include "opencv2/opencv.hpp" 2 #include <iostream> 3 using namespace std; 4 using namespace cv; 5 6 void main() 7 { 8 Mat temp=imread("E://mu.jpg"); 9 Mat src=imread("E://lena.jpg"); 10 Mat dst=src.c

opencv学习之路(20)、直方图应用

一.直方图均衡化--equalizeHist() 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 4 void main() 5 { 6 Mat srcImg = imread("E://02.jpg", 0); //以灰度方式打开,需要输入单通道图像 7 imshow("src", srcImg); 8 Mat dstImg; //均衡化后的图像 9 equalizeHist(sr