通过opencv和vc++计算矩形内部的填充比

    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;
}

第一步:读入图像。 

待统计图像
待统计图像

第二步:再现并统计。 

第一个矩形
第二个矩形

第三步:输出。 

统计结果
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值