opencv——对象计数

思路:
1、通过形态学操作、阈值处理、距离变换等方法,使得各个轮廓分开
2、计算轮廓数量
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h> using namespace cv;
using namespace std; int main(int argc, char** argv)
{
Mat src = imread("计数.jpg");
//medianBlur(src, src,5);//中值滤波,去除椒盐噪声
imshow("src", src); Mat src_gray,binary; cvtColor(src,src_gray,COLOR_BGR2GRAY); threshold(src_gray,binary,,,THRESH_BINARY|THRESH_TRIANGLE);//颜色单一时,使用THRESH_TRIANGLE比OTSU好
imshow("binary", binary); //形态学操作
Mat kernel = getStructuringElement(MORPH_RECT,Size(,));
dilate(binary, binary, kernel,Point(-,-),); //距离变换
Mat dist;
bitwise_not(binary, binary);//取反
distanceTransform(binary,dist,CV_DIST_L2,);
normalize(dist, dist,,1.0,NORM_MINMAX);
imshow("dist", dist); //阈值化二值分割
//threshold(dist, dist,0.7,1.0,THRESH_BINARY);//对距离进行筛选,去除边缘部分
//normalize(dist, dist, 0, 255, NORM_MINMAX);
Mat dist_8U;
dist.convertTo(dist_8U,CV_8U);
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_8U", 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 ;
}
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("计数.jpg");
//medianBlur(src, src,5);//中值滤波,去除椒盐噪声
imshow("src", src);
Mat src_gray,binary;
cvtColor(src,src_gray,COLOR_BGR2GRAY);
threshold(src_gray,binary,0,255,THRESH_BINARY|THRESH_TRIANGLE);//颜色单一时,使用THRESH_TRIANGLE比OTSU好
imshow("binary", binary);
//形态学操作
Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5));
dilate(binary, binary, kernel,Point(-1,-1),4);
//距离变换
Mat dist;
bitwise_not(binary, binary);//取反
distanceTransform(binary,dist,CV_DIST_L2,3);
normalize(dist, dist,0,1.0,NORM_MINMAX);
imshow("dist", dist);
//阈值化二值分割
//threshold(dist, dist,0.7,1.0,THRESH_BINARY);//对距离进行筛选,去除边缘部分
//normalize(dist, dist, 0, 255, NORM_MINMAX);
Mat dist_8U;
dist.convertTo(dist_8U,CV_8U);
adaptiveThreshold(dist_8U, dist_8U, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 85, 0.0);//自适应阈值,代替上面的阈值操作
//形态学操作,使得断开部分连接
kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
dilate(dist_8U, dist_8U, kernel, Point(-1, -1),3);
imshow("dist_8U", 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(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("number of corns : %d", contours.size());
imshow("Final result", markers);
waitKey(0);
return 0;
}
opencv——对象计数的更多相关文章
- 大数据计算:如何仅用1.5KB内存为十亿对象计数
大数据计算:如何仅用1.5KB内存为十亿对象计数 Big Data Counting: How To Count A Billion Distinct Objects Using Only 1.5K ...
- opencv实践::对象计数
问题描述 真实案例,农业领域经常需要计算对象个数 或者在其它领域拍照自动计数,可以提供效率,减低成本 解决思路 通过二值分割+形态学处理+距离变换+连通区域计算 #include <opencv ...
- opencv——对象提取与测量
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...
- Opencv轮廓计数(学习)
#include <iostream>#include <opencv2/opencv.hpp>#include <opencv2/xfeatures2d.hpp> ...
- 图像储存容器Mat[OpenCV 笔记11]
IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. ...
- opencv::分水岭图像分割
分水岭分割方法原理 (3种) - 基于浸泡理论的分水岭分割方法 (距离) - 基于连通图的方法 - 基于距离变换的方法 图像形态学操作: - 腐蚀与膨胀 - 开闭操作 分水岭算法运用 - 分割粘连对象 ...
- .NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子
上一篇文章介绍了句柄的基本概念,也描述了C#中创建文件句柄的过程.我们已经知道句柄代表Windows内部对象,文件对象就是其中一种,但显然系统中还有更多其它类型的对象.本文将简单介绍Windows对象 ...
- 《more effective c++》条款26 限制类对象的个数
问题: 如何限制类对象的个数?比如1个,10个等等. 方法(1): 将类的构造函数定义为private,那么就无法实例化这个类了.但是如何创建1个对象出来?方法有2种: 1.声明一个友元函数,那么在友 ...
- ASP.NET内置对象二
(1)Respose对象 利用Response对象输出文字信息: protected void Page_Load(object sender, EventArgs e){ string messag ...
随机推荐
- xshell提示采购解决方法
参考http://blog.csdn.net/longgeaisisi/article/details/78637179
- python3获取一个网页特定内容
我们今天要爬取的网址为:https://www.zhiliti.com.cn/html/luoji/list7_1.html 一.目标:获取下图红色部分内容 即获取所有的题目以及答案. 二.实现步骤. ...
- Windows10设置
按下Win+R键,输入gpedit.msc,打开组策略窗口
- 【CLR Via C#】15 枚举类型与位类型
1.基础 枚举类型(enumerated types)定义了一组“符号名称/值”配对. 枚举类型是值类型,每个枚举类型都是从System.Enum派生的,而System.Enum又是从System.V ...
- ActiveReports 报表应用教程 (15)---报表换肤
在葡萄城ActiveReports报表中,可以设置报表中不同控件的样式,然后把这些样式保存到一个外部的XML文件当中,供其他报表使用.如果用户希望同一份报表以不用的外观分发,只需要简单地修改样式表单, ...
- Intellij IDEA创建javaweb步骤详解
一.创建并设置javaweb工程 1.创建javaweb工程File --> New --> Project... 设置工程名字: 创建完成后工程结构如下: 2. Web工程设置2.1 在 ...
- Android热修复之 - 阿里开源的热补丁
1.1 基本介绍 我们先去github上面了解它https://github.com/alibaba/AndFix 这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是 ...
- cuda中用cublas库做矩阵乘法
这里矩阵C=A*B,原始文档给的公式是C=alpha*A*B+beta*C,所以这里alpha=1,beta=0. 主要使用cublasSgemm这个函数,这个函数的第二个参数有三种类型,这里CUBL ...
- 从ibd文件获取表空间id
xtrabackup恢复过程中出现如下错误 InnoDB: Doing recovery: scanned up to log sequence number ( %) InnoDB: Doing r ...
- Redis集群迁移
1:开发中断程序,登录各个主节点查看key信息 INFO # Keyspace db0:keys,expires,avg_ttl # Keyspace db0:keys,expires,avg_ttl ...