OpenCV实战(五)——对象简单计数

 现在我们用OpenCV来计数图像当中的目标物体数目,针对各个物体之间没有粘连的情况:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
 
using namespace cv;
using namespace std;
 
int main( )
{
    Mat  src_img,gray_img, binary_img;
    src_img = imread("rise.png");
    if (src_img.empty()) 
    {
        printf("could not load the image...\n");
        return -1;
    }
    namedWindow("原图", CV_WINDOW_AUTOSIZE);
    imshow("原图", src_img);
    cvtColor(src_img, gray_img, COLOR_BGR2GRAY);   // 彩色图转化为灰度图
 
    // 将灰度图像进行二值分割
    threshold(gray_img, binary_img, 0, 255, THRESH_BINARY|THRESH_TRIANGLE);
    imshow("二值图", binary_img);
 
    // 形态学操作
    Mat kernel = getStructuringElement(MORPH_RECT, Size(5,5), Point(-1, -1));     //获取矩形结构元
    erode(binary_img, binary_img, kernel, Point(-1, -1), 1);
    dilate(binary_img, binary_img, kernel, Point(-1, -1), 1);
    imshow("膨胀运算", binary_img);
 
 
    // 连通区域计数
    vector<vector<Point>> contours;
    findContours(binary_img, contours, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
 
    // draw result
    Mat markers = Mat::zeros(src_img.size(), CV_8UC3);
    RNG rng(12345);
    for (size_t t = 0; t < contours.size(); ++t) 
    {
        drawContours(markers, contours, static_cast<int>(t), Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)),
            -1, 8, Mat());
    }
    printf("检测的结果(数目) : %d", contours.size());
    imshow("最终结果", markers);
 
    waitKey(0);
    return 0;
}
运行程序:

--------------------- 
作者:行歌er 
来源:CSDN 
原文:https://blog.csdn.net/weixin_41695564/article/details/80109560 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值