问题描述
  真实案例,农业领域经常需要计算对象个数 或者在其它领域拍照自动计数,可以提供效率,减低成本
解决思路 
  通过二值分割+形态学处理+距离变换+连通区域计算

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h> using namespace cv;
using namespace std; int main(int argc, char** argv) {
Mat gray_src, binary, dst;
Mat src = imread("D:/case5.png");
if (src.empty()) {
printf("could not load image...\n");
return -;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
cvtColor(src, gray_src, COLOR_BGR2GRAY); // 二值分割
threshold(gray_src, binary, , , THRESH_BINARY | THRESH_TRIANGLE);
imshow("binary image", binary); // 形态学操作
Mat kernel = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -));
// 膨胀
dilate(binary, binary, kernel, Point(-, -), );
imshow("dilate image", binary); // 距离变换
Mat dist;
// 取反
bitwise_not(binary, binary);
distanceTransform(binary, dist, CV_DIST_L2, );
// 归一化
normalize(dist, dist, , 1.0, NORM_MINMAX);
imshow("dist image", dist); // 阈值化二值分割
Mat dist_8u;
dist.convertTo(dist_8u, CV_8U);
// 高斯阈值 101 必须是奇数
adaptiveThreshold(dist_8u, dist_8u, , ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, , 0.0);
kernel = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -));
dilate(dist_8u, dist_8u, kernel, Point(-, -), );
imshow("dist-binary", dist_8u); // 连通区域计数
vector<vector<Point>> contours;
findContours(dist_8u, contours, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // draw result
Mat markers = Mat::zeros(src.size(), CV_8UC3);
RNG rng();
for (size_t t = ; t < contours.size(); t++) {
drawContours(markers, contours, static_cast<int>(t), Scalar(rng.uniform(, ), rng.uniform(, ), rng.uniform(, )),
-, , Mat());
}
printf("number of corns : %d", contours.size());
imshow("Final result", markers); waitKey();
return ;
}

opencv实践::对象计数的更多相关文章

  1. opencv实践::对象的提取

    问题描述 真实案例,对图像中对象进行提取,获取这样对象,去掉其它干扰和非目标对象. 解决思路 二值分割 + 形态学处理 +横纵比计算 #include <opencv2/opencv.hpp&g ...

  2. opencv实践::对象提取与测量

    问题描述 照片是来自太空望远镜的星云图像,科学家想知道它的面 积与周长. 解决思路 方法一: 通过二值分割+图像形态学+轮廓提取 #include <opencv2/opencv.hpp> ...

  3. 大数据计算:如何仅用1.5KB内存为十亿对象计数

    大数据计算:如何仅用1.5KB内存为十亿对象计数  Big Data Counting: How To Count A Billion Distinct Objects Using Only 1.5K ...

  4. opencv——对象计数

     思路: 1.通过形态学操作.阈值处理.距离变换等方法,使得各个轮廓分开 2.计算轮廓数量 #include <opencv2/opencv.hpp> #include <iostr ...

  5. HOG:从理论到OpenCV实践

    (转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 1.HOG特征描述子的定义:     locally normalised ...

  6. 【opencv实践】边缘检测

    边缘检测: 一.canny算子 Canny边缘检测根据对信噪比与定位乘积进行测度,得到最优化逼近算子,也就是Canny算子.类似与 LoG 边缘检测方法,也属于先平滑后求导数的方法. 二.canny算 ...

  7. SVM:从理论到OpenCV实践

    (转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途)   一.理论 参考网友的博客: (1)[理论]支持向量机1: Maximum Marg ...

  8. OpenCV实践之路——人脸检测(C++/Python) 【转】

    转自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 版权声明:本文为博主原创文章,转载请联系作者取得授权. 本文由@星沉 ...

  9. OpenCV实践之路——Python的安装和使用

    本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50936076 微博:http ...

随机推荐

  1. 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1

    题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...

  2. charles 视图菜单总结

    本文参考:charles 视图菜单总结 Charles的视图菜单里的东西其实是非常常用的功能: 但是我们一般是不需要从这里点进来的: 里面,无非是查看的视图结构(按照域名和按照访问时间) 然后是一些概 ...

  3. sql server 使用 partition by 分区函数 解决不连续数字查询问题

    sql server表中的某一列数据为不一定连续的数字,但是需求上要求按照连续数字来分段显示,如:1,2,3,4,5,6,10,11,12,13, 会要求这样显示:1~6,10~13.下面介绍如何实现 ...

  4. SpringBoot整合Nacos注册中心

    #### 什么是Nacos Nacos 是阿里巴巴的开源的项目,Nacos致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流 ...

  5. (七十三)c#Winform自定义控件-资源加载窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  6. Spring Boot (五): Redis缓存使用姿势盘点

    1. Redis 简介 Redis 是目前业界使用最广泛的内存数据存储.相比 Memcached,Redis 支持更丰富的数据结构,例如 hashes, lists, sets 等,同时支持数据持久化 ...

  7. Roman and Browser-罗曼的浏览器 CodeForce1100A 暴力

    题目链接:Roman and Browser 题目原文 This morning, Roman woke up and opened the browser with 

  8. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(协程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from gevent import monkey monkey.patch_all() from gevent.pool i ...

  9. linux mint 19.2与Windows 10 双系统硬盘安装与卸载

    安装linux mint 和win10双系统: 1.win10系统下如果没有空闲分区,请从容量较大的分区用partition manager在选中的较大的分区下,调整大小.此步骤最好在pe下的part ...

  10. python datetime和time的一些疑惑解答 及 获取上年同期、上月等日期

    关于datetime和time有几个疑惑的 1.datetime.datetime.now()——为什么需要两个datetime才能返回当前时间,同样的time只需要time.localtime() ...