计算连通区域的像素点个数,找目标圆点
来源:互联网 发布:淘宝代写作业 编辑:程序博客网 时间:2024/05/17 02:26
任务
圈出小圆点,不能圈不规则白点
参考知识
http://blog.csdn.net/qq_16540387/article/details/78844965
http://blog.csdn.net/qq_16540387/article/details/78843936
源码
//------------------------------------------------------------------------------------------------#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>using namespace cv;using namespace std;#define WINDOW_NAME "【程序窗口】" //为窗口标题定义的宏 double area;//轮廓面积int g_nThresholdValue = 131;//二值化阈值int g_nThresholdType = 3;double minarea = 378;//目标轮廓最小像素点个数double maxarea = 478;//目标轮廓最大像素点个数Moments mom; // 轮廓矩 Mat image, gray, edge, dst, g_srcImage1, dst1,g_srcImage,g_grayImage,g_dstImage;vector<vector<Point> > contours; //轮廓数组 vector<Point2d> centers; //轮廓质心坐标 vector<vector<Point> >::iterator itr; //轮廓迭代器 vector<Point2d>::iterator itrc; //质心坐标迭代器 vector<vector<Point> > con; //当前轮廓 Point2d center;//质心坐标void on_Threshold(int, void*);//回调函数int main(){ //【1】读入源图片 g_srcImage = imread("pos71_run7_img190.jpg"); //resize(g_srcImage, g_srcImage1, Size(g_srcImage.cols / 4, g_srcImage.rows / 4), 0, 0, INTER_LINEAR); //imshow("原始图", g_srcImage1); cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);//灰度转换 namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE); createTrackbar("模式", WINDOW_NAME, &g_nThresholdType,//二值化模式 4, on_Threshold); createTrackbar("参数值", WINDOW_NAME, &g_nThresholdValue,//二值化阈值 255, on_Threshold); on_Threshold(0, 0);//滑动条回调函数 while (1) { int key; key = waitKey(20); if ((char)key == 27){ break; } }}void on_Threshold(int, void*){ //调用阈值函数 threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, CV_THRESH_BINARY); //resize(g_dstImage, g_srcImage1, Size(g_dstImage.cols / 4, g_dstImage.rows / 4), 0, 0, INTER_LINEAR); //imshow("threshold", g_srcImage1); Mat element2 = getStructuringElement(MORPH_RECT, Size(10, 10));//膨胀模板 Mat erode1, erode2; dilate(g_dstImage, erode1, element2);//膨胀 dilate(erode1, erode2, element2); //resize(erode2, g_srcImage1, Size(erode2.cols / 4, erode2.rows / 4), 0, 0, INTER_LINEAR); //imshow("dilate", g_srcImage1); findContours(erode2, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);//找出轮廓 itr = contours.begin(); //使用迭代器去除非目标轮廓 while (itr != contours.end()) { area = contourArea(*itr);//计算面积 if ((area<minarea) | (area>maxarea)) { itr = contours.erase(itr); //删除 } else { itr++; } } dst = Mat::zeros(erode2.rows, erode2.cols, CV_8UC3);//保存中间结果 itr = contours.begin(); while (itr != contours.end()) { area = contourArea(*itr); con.push_back(*itr); //cout << "\nb " << area; drawContours(dst, con, -1, Scalar(255, 0, 0), 2); //目标区域蓝色绘制 mom = moments(*itr); //计算质心 center.x = (int)(mom.m10 / mom.m00); center.y = (int)(mom.m01 / mom.m00); char tam[10000]; char sam[10000]; sprintf(tam, "(%0.0f)", area); sprintf(sam, "(%0.0f,%0.0f)", center.x, center.y); putText(dst, tam, Point(center.x, center.y), FONT_HERSHEY_SIMPLEX, 2, Scalar(255, 0, 0), 5);//标出面积 putText(dst, sam, Point(center.x, center.y + 80), FONT_HERSHEY_SIMPLEX, 2, Scalar(0, 255, 0), 5);//标出质心 //imwrite("20003.jpg", dst); //resize(dst, dst1, Size(dst.cols / 4, dst.rows / 4), 0, 0, INTER_LINEAR); //imshow("中间结果", dst1); circle(g_srcImage, Point(center.x, center.y), 5, Scalar(0, 225, 0), 2, 3);//画圆 con.pop_back(); itr++; } resize(g_srcImage, g_srcImage1, Size(g_srcImage.cols / 4, g_srcImage.rows / 4), 0, 0, INTER_LINEAR); //更新效果图 imshow(WINDOW_NAME, g_srcImage1); //imwrite("s_pos71_run7_img190.jpg", g_srcImage);}
实验结果
阅读全文
0 0
- 计算连通区域的像素点个数,找目标圆点
- 连通区域的边界点程序
- 区域点内个数
- MATLAB 简单的计算白色轮廓中像素点的个数
- 给自己找点目标
- 使用DFS计算连通区域个数
- pku1737给定点求连通图的个数
- VS+++opencv++MFC++数米粒【计算联通区域的个数及联通区域内像素的个数】
- VS+++opencv++MFC++数米粒【计算联通区域的个数及联通区域内像素的个数】
- OpenCV统计米粒数目-计算联通区域的个数及联通区域内像素的个数
- OpenCV统计米粒数目-计算联通区域的个数及联通区域内像素的个数
- OpenCV统计米粒数目-计算联通区域的个数及联通区域内像素的个数
- 区域赛选拔题--Moon Game--计算几何&&判断平面点集组成的凸边行的个数
- 像素点的绘制
- fzu 2231 根据坐标面上的点找平行四边形个数
- 强连通分量+缩点(记录所缩点的个数)
- N个数计算24点
- 4个数计算24点
- 三角函数各角度的值,角度用π的形式表示
- MC9S08DZ60移植ucos小记
- 导入VMware虚拟机磁盘格式的选择(厚置备延迟置零、厚置备置零、thin)
- java编写创建json,将json数据转换成xml,ftp发送到服务器
- 网关及网关作用
- 计算连通区域的像素点个数,找目标圆点
- C#中将字符串转成大写或者小写的函数
- node
- 学习笔记一:learning rate,weight decay和momentum的理解
- JavaSE基础
- 新能源汽车补贴政策再调整,补贴几十亿依旧不给力
- [Idea] 如何快速将idea[快捷键]转化成Eclipse风格
- 万树IT:程序员的几种不同阶段
- ios wireshark 抓包