基于的类圆目标自动计数演示程序
2014-06-16 21:35
295 查看
图1:原图
图2:阈值化 图3:***圆圈标记结果
请点击超练级获取图像地址
实现过程:我对这个演示Demo做个大概介绍,图中圆斑重叠区域较少,因此处理难度也较小,充其量只能做个演示作用;再次,程序中的分割阈值也是几经尝试认为确定的,没有使用自适应阈值化;经观察图中目标的面积特征较为明显,因此最后的结果是根据面积特征得出的(当然目标和背景的颜色差异也是较大的,也可以作为特征使用,本人未做验证)。基本流程如下:
将图像灰度化;cvtColor()
对图像进行平滑处理,减少噪声;blur()
对图像进行阈值化处理;threshold(),效果见图2
提取图像中目标的轮廓,分析了轮廓的周长和面积,可以的话,可以建立目标面积特征的直方图,可以根据直方图进行自适应选取特征阈值,但是本程序没有采用直方图,而是根据观察做出的阈值。
根据面积阈值,在原图中标记目标,效果见图3。从图中看,目标基本上都识别出来了,但是也有一些错误识别。
下面是本演示项目的程序:
/************************************************* ***matching_test.cpp ***Created on: Oct 17, 2010 ***Author: ethan *************************************************/ /************************************************* **************************************************/ #pragma warning (disable:4786) //#pragma comment () /*************************************************/ #include "opencv2/opencv.hpp" #include "opencv2/core/core.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/nonfree/features2d.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/stitching/stitcher.hpp" #include "opencv2/stitching/warpers.hpp" #include <map> #include <math.h> #include <time.h> #include <stdlib.h> #include <vector> #include <iostream> #include <Windows.h> /***命名空间***/ using namespace cv; using namespace std; /*************************/ /*************************/ int main( int argc, char** argv ) { Mat src; src = imread("test1.jpg"); resize(src,src,Size(640,480)); Mat gray; cvtColor(src,gray,CV_BGR2GRAY); blur(gray,gray,Size(13,13)); imshow("Gray Image",gray); Mat thresh; threshold(gray,thresh,90,255,THRESH_BINARY); imshow("Thresholded Image",thresh); imwrite("thresh.jpg",thresh); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(thresh,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); Mat src_show = src.clone(); for(int i = 0; i < contours.size(); i++) { float length = arcLength(contours[i],true); float area = contourArea(contours[i],false); if(area > 10 && area < 800) { drawContours(src_show,contours,i,Scalar(0,236,255)); cout << "contour[" << i << "] = " << length << endl; cout << "Area[" << i << "] = " << area << endl; imshow("src_show",src_show); waitKey(2000); } } imwrite("result.jpg",src_show); waitKey(0); system("pause"); }
相关文章推荐
- 基于AjaxHelper0.41的相册范例程序演示及一个关于博客园的功能建议
- [转帖]调用explore打开指定文件所在的文件夹,并把目标文件设为选定状态,甚至.lnk文件也能自动找到它的目标执行程序文件。
- 基于C#实现的开源自动更新程序
- 基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装
- 如何让基于对话框的MFC程序启动后自动隐藏对话框
- 基于visual c++之windows核心编程代码分析 自动下载更新程序
- 【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
- 基于二叉堆的ASTAR算法演示程序
- Sersync 是一款基于inotify + rsync 的大量文件的多服务器自动同步程序
- 基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装
- 窗口自动靠边程序演示
- 基于TCP的网络通信程序演示[命令行程序]
- 基于对话框的MFC程序启动后自动隐藏对话框
- 基于2410/2440让程序在Windows CE系统启动时自动运行(含platform.reg .dat .bib介绍)
- VC里基于对话框的程序屏蔽回车键自动退出程序
- 调用explore打开指定文件所在的文件夹,并把目标文件设为选定状态,甚至.lnk文件也能自动找到它的目标执行程序文件。
- VC里基于对话框的程序屏蔽回车键自动退出程序
- 基于QUpdater组件为你的WinForm程序添加自动升级功能
- MFC三层模式标准版V1.5版演示源码(VC++代码生成,VC非托管代码,基于对话框程序)
- 基于OpenGL的LS分形演示程序