Opencv的findContours函数只知道轮廓,和能够套紧的最小矩形,但是无法知道所套紧的矩形的填充比例,即矩形的面积与矩形内部前景面积的比例。
该方法调用了一些opencv中与矩形相关的函数,例如:findContours、drawContours、cvBoxPoints等。
实现手段:通过调用opencv中的findContours函数,找出图片中矩形的个数并记录矩形的坐标,然后,通过调用drawContours函数,将所找到矩形在新创建的全黑图像上进行1:1比例的逐一再现,最后计算全黑图像上的白点个数和矩形面积,得出填充比。代码包链接:https://download.csdn.net/download/zhaonan9523/11189662
过程如下:
#include "stdafx.h"
#include <iostream>
#include <zbar.h>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc_c.h>
#include <cv.h>
using namespace cv;
using namespace std;
using namespace zbar;
int main()
{
int c_size, i, m, n;
CvBox2D rect[10];
CvPoint2D32f rectpoint[4];
vector<vector<Point> > contours;
Mat srcimage = imread("..\\2.jpg");
Mat image;
cvtColor(srcimage, image, CV_BGR2GRAY);//获取灰度图
threshold(image, image, 170, 255, CV_THRESH_BINARY);//二值化
findContours(image, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
c_size = contours.size();
for (i = 0; i < c_size && i<10; i++)
{
int k = 0;
Mat Imgblack = Mat::zeros(image.rows, image.cols, CV_8UC1);
rect[i] = minAreaRect(Mat(contours[i]));
cvBoxPoints(rect[i], rectpoint); //获取4个顶点坐标
drawContours(Imgblack, contours,i, Scalar(128), -1); //在全黑的图上填充
double rectarea = (rect[i].size.width* rect[i].size.height);
Scalar a = sum(Imgblack);
k = a[0]/128;
double th = double(k) / rectarea;
cout << "填充面积:" << endl << k << endl ;
cout << "矩形面积:" << endl << rectarea << endl ;
cout << "比例:" << endl << th << endl ;
line(Imgblack, rectpoint[0], rectpoint[1], Scalar(255), 2); //画矩形
line(Imgblack, rectpoint[1], rectpoint[2], Scalar(255), 2);
line(Imgblack, rectpoint[2], rectpoint[3], Scalar(255), 2);
line(Imgblack, rectpoint[3], rectpoint[0], Scalar(255), 2);
char strTmp[40];
sprintf(strTmp, "Imgblack_%d", i);
imshow(strTmp, Imgblack);
}
cvWaitKey(0);
return 0;
}
第一步:读入图像。
![待统计图像](https://i-blog.csdnimg.cn/blog_migrate/b362d761b423f86fbb3caf89de58a0ff.jpeg)
第二步:再现并统计。
![](https://i-blog.csdnimg.cn/blog_migrate/d3e79e3f6801b7e871d18ef67ffa00fa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8d49a282b7073f7c9c89e5eb7ec9ca42.png)
第三步:输出。
![](https://i-blog.csdnimg.cn/blog_migrate/844483370198848396d8eafefb943778.png)