opencv 区域提取三种算法

opencv 区域提取三种算法

1.轮廓查找

findContours()函数,得到轮廓的点集集合

C++ 复制代码
  cv::vector<cv::vector<Point>> contours;
	threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);
  
  	//膨胀处理
  Mat dilaElement = getStructuringElement(MORPH_ELLIPSE, Size(m_pPara.m_nDilation, m_pPara.m_nDilation));

	dilate(binImg, binImg, dilaElement);
  
  //腐蚀处理
  Mat eroElement = getStructuringElement(MORPH_ELLIPSE, Size(m_pPara.m_nErosion, m_pPara.m_nErosion));
	erode(binImg, binImg, eroElement);
  
  //计算轮廓面积
  for (int k=0;k<contours.size();k++)
	{
		//面积筛选
		dArea = contourArea(contours[k]);
    
    //轮廓填充绘制
    Mat imgBack = Mat::zeros(roiMat.size(), CV_8U);
		drawContours(imgBack, contours,k,255, -1);
  }
  
  //计算轮廓中心点
  	Moments mu = moments(contours2[0]);
		Point2f center(mu.m10/mu.m00,mu.m01/mu.m00);
  //计算轮廓外接矩形
		cv::Rect bRect = boundingRect(contours2[0]);
					

	  //计算轮廓旋转外接矩形					
	  cv::RotatedRect rotRect= cv::minAreaRect(contours2[0]);
	  Point2f pointsArr[4];
	  rotRect.points(pointsArr);

检测结果如下:

2.斑点检测

SimpleBlobDetector函数

C++ 复制代码
 //区域检测参数设置 
 SimpleBlobDetector::Params params;

 //二值化阈值
 params.minThreshold = 100;
 params.maxThreshold = 255;

 //斑点颜色
 params.filterByColor =false;

 //斑点面积

 params.filterByArea = true;

 params.minArea = m_pPara.m_nMinArea;
 params.maxArea =  m_pPara.m_nMaxArea;

 //斑点圆度
 params.filterByCircularity = true;
 params.minCircularity =m_pPara.m_dMinCir;

 //斑点惯性率
 params.filterByInertia = false;

 //斑点凸度比
 params.filterByConvexity = true;
 params.minCircularity = m_pPara.m_dMinCon;

 SimpleBlobDetector detector(params);
 //得到轮廓的关键点
 vector<KeyPoint> keypoints;
 detector.detect(roiMat, keypoints);

KeyPoint:

Point2f pt 关键点坐标

float size 点直径大小

float angle 关键点方向

检测结果如下:

3.角点检测

goodFeaturesToTrack()函数

C++ 复制代码
    //存储角点位置
		vector<cv::Point2f> corners;
		//最小可接受的向量值
		double qualityLevel = 0.03;
		//两个角点之间的最小距离
		double minDistance = 6;
    
    //计算协方差矩阵的窗口大小
		int blockSize = 3;
    
    
		bool useHarris = false;
		double k = 0.04;
    //识别角点个数
		int num_corners = 3;

		cv::goodFeaturesToTrack(roiMat, corners, num_corners, qualityLevel, minDistance,
			cv::Mat(), blockSize, useHarris, k);
      
    //拟合亚像素角点位置
		//区域大小
		cv::Size winSize = cv::Size(3, 3);
		//类似于winSize,但总是有较小的范围, (-1,-1)表示忽略
		cv::Size zerozone = cv::Size(-1, -1);
		//迭代循环结束条件,三个参数,1:结束条件,2:最大迭代次数,3:阈值
		//以下TermCriteria表示同时到达最大迭代次数40与角点位置变化的最小值达到0.001则停止迭代
		cv::TermCriteria tc = cv::TermCriteria(cv::TermCriteria::EPS +
			cv::TermCriteria::MAX_ITER, 40, 0.001);
		//计算亚像素角点位置
		cv::cornerSubPix(roiMat, corners, winSize, zerozone, tc);

检测结果如下:

相关推荐
ytttr873几秒前
matlab进行利用遗传算法对天线阵列进行优化
开发语言·算法·matlab
一招定胜负2 分钟前
机器学习算法三:决策树
算法·决策树·机器学习
无限进步_2 分钟前
【C语言】队列(Queue)数据结构的实现与分析
c语言·开发语言·数据结构·c++·算法·链表·visual studio
李余博睿(新疆)12 分钟前
c++经典练习题-分支练习(2)
c++·算法
Dev7z14 分钟前
基于中心先验的全局对比度显著性检测算法
人工智能·算法·计算机视觉
重生之我是Java开发战士16 分钟前
【算法日记】排序算法:原理、实现、性能与应用
数据结构·算法·排序算法
陈天伟教授23 分钟前
人工智能训练师认证教程(4)OpenCV 快速实践
人工智能·python·神经网络·opencv·机器学习·计算机视觉
啊阿狸不会拉杆27 分钟前
《数字图像处理》第 5 章-图像复原与重建
图像处理·人工智能·算法·matlab·数字图像处理
百***787530 分钟前
【技术教程】3步极速接入GPT-5.1:零门槛体验多模态AI能力
android·java·人工智能·gpt·opencv
断剑zou天涯37 分钟前
【算法笔记】资源限制类题目的解题套路
笔记·算法·哈希算法