返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++OpenCV实战之标记点检测的实现
  • 265
分享到

C++OpenCV实战之标记点检测的实现

2024-04-02 19:04:59 265人浏览 八月长安
摘要

在实际应用中,能够直接利用霍夫圆检测这些理想方法的应用场景是非常少的,更多的是利用拟合的办法去寻找圆形。 大致思路如下,首先先选择要处理的ROI部分,记录下该图的左上点在原图的坐标,

在实际应用中,能够直接利用霍夫圆检测这些理想方法的应用场景是非常少的,更多的是利用拟合的办法去寻找圆形。

大致思路如下,首先先选择要处理的ROI部分,记录下该图的左上点在原图的坐标,如果原图过大,要先进行等比例缩放;然后利用自适应阈值和Canny边缘提取进行处理,再进行闭运算与轮廓检测,计算点集面积,通过筛选面积阈值去除杂点,最后进行轮廓检测,拟合椭圆,效果如下:

1.导入原图:

2.截取ROI

3.进行自适应阈值化与Canny边缘提取

4.进行闭运算,然后轮廓检测,然后计算点集面积,通过面积阈值去除杂点

5.再次进行轮廓检测,拟合椭圆

代码如下:

#include <OpenCV2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>
#include <iOStream>

#define scale 2//图像缩放因子
#define cannythreshold 80

typedef struct _ROIStruct
{
	cv::Point2d ROIPoint;
	cv::Mat ROIImage;
}ROIStruct;

ROIStruct getROI(cv::Mat src,bool flag = false)
{
	ROIStruct ROI_Struct;
	cv::Rect2d ROIrect = selectROI(src);
	ROI_Struct.ROIPoint = ROIrect.tl();//获取ROI区域左上角的点
	ROI_Struct.ROIImage = src(ROIrect);

	if (flag == true)
	{
		cv::imshow("ROI", ROI_Struct.ROIImage);
	}

	return ROI_Struct;
}
int main()
{
	cv::Mat srcImage = cv::imread("7.jpg");//读取待处理的图片
	cv::resize(srcImage, srcImage, cv::Size(srcImage.cols / scale, srcImage.rows / scale));//图像缩放,否则原来图像会在ROI时显示不下
	
	ROIStruct ROI = getROI(srcImage);//选择ROI区域
	
	cv::Mat DetectImage, thresholdImage;
	ROI.ROIImage.copyTo(DetectImage);
	cv::imshow("ROI", DetectImage);
	cv::cvtColor(DetectImage, thresholdImage, CV_RGB2GRAY);
	cv::adaptiveThreshold(thresholdImage, thresholdImage, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY,11,35);//自适应阈值
	cv::Canny(thresholdImage, thresholdImage, cannythreshold, cannythreshold * 3, 3);
	
	cv::imshow("thresholdImage", thresholdImage);
	
	std::vector<std::vector<cv::Point>> contours1;
	std::vector<cv::Vec4i> hierarchy1;
	cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3));
	cv::morphologyEx(thresholdImage, thresholdImage, cv::MORPH_CLOSE, element,cv::Point(-1,-1),2);
	cv::Mat findImage = cv::Mat::zeros(thresholdImage.size(), CV_8UC3);

	cv::findContours(thresholdImage, contours1, hierarchy1,CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

	for (int i = 0; i <contours1.size();i++)
	{
		double area = cv::contourArea(contours1[i]);
		//std::cout << i << "点集区域面积:" << area << std::endl;
		
		if (area < 120)
		{
			continue;
		}

		else
		{
			drawContours(findImage, contours1, i, cv::Scalar(255, 255, 255), -1, 8, cv::Mat(), 0, cv::Point());
		}

	}

	cv::imshow("drawing", findImage);

	cv::Mat CircleImage(findImage.size(),CV_8UC1);
	findImage.copyTo(CircleImage);
	cv::cvtColor(CircleImage, CircleImage, CV_RGB2GRAY);
	
	std::vector<std::vector<cv::Point>> contours2;
	std::vector<cv::Vec4i> hierarchy2;

	cv::Mat resultImage(CircleImage.size(), CV_8UC3);
	cv::findContours(CircleImage, contours2, hierarchy2, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
	std::vector<cv::Point> points1, points2;
	
	cv::Mat compareImage;
	DetectImage.copyTo(compareImage);

	for (int j = 0; j <contours2.size();j++)
	{
		cv::RotatedRect box = cv::fitEllipse(contours2[j]);
		points1.push_back(box.center);
		ellipse(resultImage, box, cv::Scalar(0, 0, 255), 1, CV_AA);
		ellipse(compareImage, box, cv::Scalar(0, 0, 255), 1, CV_AA);
	}
	
	for (int i = 0; i < points1.size(); i++)
	{
		cv::Point ans;
		ans.x = ROI.ROIPoint.x + points1[i].x;
		ans.x = ans.x*scale;
		ans.y = ROI.ROIPoint.y + points1[i].y;
		ans.y = ans.y*scale;
		points2.push_back(ans);
	}

	std::cout << points1 << std::endl;
	std::cout << ROI.ROIPoint << std::endl;
	std::cout << points2 << std::endl;

	cv::imshow("resultImage", resultImage);
	cv::imshow("compareImage", compareImage);
	cv::waiTKEy(0);
	return 0;
}

到此这篇关于c++ OpenCV实战之标记点检测的实现的文章就介绍到这了,更多相关C++ OpenCV标记点检测内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++OpenCV实战之标记点检测的实现

本文链接: https://lsjlt.com/news/143478.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++OpenCV实战之标记点检测的实现
    在实际应用中,能够直接利用霍夫圆检测这些理想方法的应用场景是非常少的,更多的是利用拟合的办法去寻找圆形。 大致思路如下,首先先选择要处理的ROI部分,记录下该图的左上点在原图的坐标,...
    99+
    2024-04-02
  • C++ OpenCV标记点检测怎么实现
    这篇文章主要介绍“C++ OpenCV标记点检测怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++ OpenCV标记点检测怎么实现”文章能帮助大家解决问题。效果如下:导...
    99+
    2023-06-29
  • C++OpenCV实战之网孔检测的实现
    目录前言一、HSV通道转换二、图像修复2.1 OpenCV函数实现2.2 MyFunction三、轮廓提取四、效果显示五、源码总结前言 前段时间,有位粉丝私信我,给我发了一张图片,如...
    99+
    2024-04-02
  • C++ OpenCV实战之车道检测
    目录前言一、获取车道ROI区域二、车道检测1.灰度、阈值2.获取非零像素点3.绘制车道线总结前言 本文将使用OpenCV C++ 进行车道检测。 一、获取车道ROI区域 原图如图所...
    99+
    2024-04-02
  • Python实战之OpenCV实现猫脸检测
    开发工具 Python版本:3.6.4 相关模块: cv2模块; 以及一些Python自带的模块。 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可。 原理简介 简单地讲一讲Haar分类器,也...
    99+
    2022-06-02
    OpenCV实现猫脸检测 Python OpenCV图像识别
  • opencv实现角点检测
    本文实例为大家分享了opencv实现角点检测的具体代码,供大家参考,具体内容如下 1、特征点的作用:使用特征点代表图像内容 运动目标跟踪物体识别图像配准全景图像拼接三维重建 2、Ha...
    99+
    2022-11-13
    opencv 角点检测
  • C++ OpenCV实战之零部件的自动光学检测
    目录一、背景二、基础知识三、代码实现1、实现多窗口展示2、降噪处理3、背景去除4、连通图实现5、计算连通域面积6、轮廓检测四、总结一、背景 首先任务背景是AOI(自动光学检测) 最重...
    99+
    2024-04-02
  • opencv-python+yolov3实现目标检测
    目录目标检测概况目标检测是?目标检测算法?yolov3模型简介性能介绍架构介绍opencv-python实现why opencv?正文因为最近的任务有用到目标检测,所以昨天晚...
    99+
    2024-04-02
  • OpenCV角点检测的实现示例
    目录Harris 角点检测算法1. 角点角点检测算法的基本思想: 2. 流程3. 实现Harris 角点检测算法 1. 角点 角点是水平方向、垂直方向变化都很大的像素。 角...
    99+
    2024-04-02
  • Qt+OpenCV实现目标检测详解
    目录一、创建项目&UI设计二、代码与演示演示效果拓展阅读一、创建项目&UI设计 创建项目,UI设计如下 文件类型判断 简单的判断文件类型 QString file(...
    99+
    2024-04-02
  • 人脸检测实战终极之OpenCV+Python实现人脸对齐
    目录前言实现面部矫正器导入必要的包对齐人脸展示结果前言 这篇博文的目的是演示如何使用 OpenCV、Python 和面部标志对齐人脸。 给定一组面部标志(输入坐标),我们的目标是将图...
    99+
    2024-04-02
  • C++ OpenCV如何实现车道检测
    这篇文章主要为大家展示了“C++ OpenCV如何实现车道检测”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++ OpenCV如何实现车道检测”这篇文章吧。一、获取车道RO...
    99+
    2023-06-28
  • opencv-python+yolov3怎么实现目标检测
    这篇文章给大家分享的是有关opencv-python+yolov3怎么实现目标检测的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目标检测概况目标检测是?目标检测,粗略来说就是:输入图片/视频,经过处理,得到:目标...
    99+
    2023-06-15
  • Python+OpenCV实现边缘检测与角点检测详解
    目录一、边缘检测1.1、读取图像1.2、图像转换成灰度图像1.3、Sobel算子1.4、Canny算子1.5、显示正常中文的标签1.6、边缘检测结果二、角点检测2.1、读取图像2.2...
    99+
    2023-02-03
    Python OpenCV边缘检测 Python OpenCV角点检测 Python OpenCV 检测
  • 使用opencv实现车道线检测实战代码
    效果 void lane_detection(cv::Mat &src, cv::Mat &dst) { dst = cv::Mat::zeros(s...
    99+
    2024-04-02
  • Android基于OpenCV实现Harris角点检测
    目录什么是角点? 为什么要检测角点? Harris角点检测 API操作效果 源码 什么是角点? 角点就是极值点,即在某方面属性特别突出的点。当然,你可以自己定义角点的属性(设置特定...
    99+
    2024-04-02
  • opencv实现颜色检测
    本文实例为大家分享了opencv实现颜色检测的具体代码,供大家参考,具体内容如下 若要在OPencv 中实现颜色检测,首先要将待检测图像转换到HSV颜色空间中,但因为颜色是一个特定的...
    99+
    2024-04-02
  • OpenCV实现直线检测
    本文实例为大家分享了OpenCV实现直线检测的具体代码,供大家参考,具体内容如下 1 介绍 本文主要介绍OpenCV自带的直线检测函数HoughLines()的用法,这个函数的第一个...
    99+
    2024-04-02
  • C++ OpenCV实现二维码检测功能
    目录前言一、二维码检测二、二维码识别三、二维码绘制四、源码总结前言 本文将使用OpenCV C++ 进行二维码检测。 一、二维码检测 首先我们要先将图像进行预处理,通过灰度、滤波、...
    99+
    2024-04-02
  • Python人脸检测实战之疲劳检测
    目录使用 OpenCV 构建犯困检测器测试疲劳检测器今天我们实现疲劳检测。 如果眼睛已经闭上了一段时间,我们会认为他们开始打瞌睡并发出警报来唤醒他们并引起他们的注意。我们测试一段视频...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作