OpenCV单目视觉定位(测量)系统(新增 含代码)(转载)
OpenCV单目视觉定位(测量)系统
The System of Vision Location with Signal Camera
Abstract:This passage mainly describes how to locate with signalcamera,which bases on OpenCV library.
Key words: OpenCV; Locate;Signalcamera
摘 要:本文主要描述的是利用开源计算机视觉库OpenCV实现单目视觉定位系统。
1 总体设计方案
单目视觉定位系统是通过单个分辨率为640*480,20万的USB手动调焦摄像头获取图片并传到计算机利用OpenCV进行预处理、识别、定位、测量等图像处理算法,进而得出目标物体相对摄像头的二维坐标距离。
2 预处理
在本系统中主要采用均值滤波算法,也叫邻域平均算法。领域平均算法的基本思想是对含噪声图像的每一个像素点f(x,y)取领域S,用领域S中所包含的像素灰度平均值来代替该点的灰度值。
领域平均法的优点是处理方法简计算速度快,缺点是在降低噪声的同时是图像产生一定程度的模糊,领域半径越大,去噪效果越好,但图像越模糊。
3 识别
3.1目标物体
对目标物体的设计,我采用了外面六边形,里面五边形,六边形与五边形之间黑色填充,其余白色填充,六边形与五边形中心基本上一致。如下图所示
3.2 Canny边缘检测
l 低错误性:标识出尽可能多的实际边缘,同时尽可能地减少噪声产生的误报。
l 最小效应:图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘
其步骤是,首先使用高斯平滑滤波器卷积降噪,计算梯度幅值和方向,然后进行非极大值抑制,排除非边缘像素,仅仅保留了一些细线条,最后滞后阈值。
3.3 轮廓分析
对上面的Canny边缘检测得出的信息运用OpenCV提供的findContours函数边缘信息转化为轮廓信息,最后再对轮廓进行分析处理,找出目标物体。
3 定位
本系统是采用640*480分辨率,20万像素的手动调焦的USB摄像头进行实验的,该摄像头广角较低,畸变不厉害。
定位功能得出的坐标是相对于自定义的图像坐标原点,在该系统中,定义的原点就是图像中心(320,240)单位为像素。因此,在摄像头水平放置的情况下,自定义图像原点即为二维空间上的摄像头正下方。
定位的基本思想是利用已知目标物体的长度和求出的目标物体的像素长度,得出像素的尺寸,再利用像素尺寸和目标物体在自定义原点的X,Y方向的像素距离,进而求出目标物体相对水平放置的摄像头的X,Y方向实际距离。
1 结束语
在接下来的时间里,作者会尽量完善该系统,争取能用于无人机以及机器人的单目视觉定位系统。
本文难免有错漏,欢迎大家指出,本人联系方式:821992904@qq.com。
核心代码:
- //定位函数
- void Location(){
- //均值滤波
- blur(gray, gray_blur, Size(3, 3));
- //边缘检测提取边缘信息
- Canny(gray_blur, dstThreshold, 150, 450);
- imshow(“canny边缘检测”, dstThreshold);
- //对边缘图像提取轮廓信息
- vector<vector<Point> >contours;
- findContours(dstThreshold, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
- //画出轮廓
- drawContours(contours_image, contours, -1, Scalar(0, 0, 255));
- imshow(“contours”, contours_image);
- //画出定义的原点
- circle(src, Point2f(oriX, oriY), 2, Scalar(0, 0, 255), 3);
- //定义分别逼近六边形和五边形的轮廓
- vector< vector<Point> > Contour1_Ok, Contour2_Ok;
- //轮廓分析
- vector<Point> approx;
- for (int i = 0; i < contours.size(); i++){
- approxPolyDP(Mat(contours[i]), approx, cv::arcLength(cv::Mat(contours[i]), true)*0.04, true);
- //去除 小轮廓,只提取凸轮廓
- if (std::fabs(cv::contourArea(contours[i])) < 600 || !cv::isContourConvex(approx))
- continue;
- //保存逼近六边形的轮廓 到 Contour1_Ok
- if (approx.size() == 6){
- Contour1_Ok.push_back(contours[i]);
- }
- //保存逼近五边形的轮廓 到 Contour2_Ok
- else if (approx.size() == 5){
- Contour2_Ok.push_back(contours[i]);
- }
- }
- //对所有符合要求的六边形,五边形轮廓进行分析
- //识别出自定义的物体的关键是:
- //1.六边形和五边形轮廓的最小外接矩形的中心基本在同一点
- //2.六边形轮廓的最小外接矩形的任一边长大于五边形轮廓的最小外接矩形的任一边长
- for (int i = 0; i < Contour1_Ok.size(); i++){
- for (int j = 0; j < Contour2_Ok.size(); j++){
- RotatedRect minRect1 = minAreaRect(Mat(Contour1_Ok[i])); //六边形轮廓的最小外接矩形
- RotatedRect minRect2 = minAreaRect(Mat(Contour2_Ok[j])); //五边形轮廓的最小外界矩形
- //找出符合要求的轮廓的最小外接矩形
- if ( fabs(minRect1.center.x - minRect2.center.x) < 30 && fabs(minRect1.center.y - minRect2.center.y)<30 && minRect1.size.width > minRect2.size.width){
- Point2f vtx[4];
- minRect1.points(vtx);
- //画出找到的物体的最小外接矩形
- for (int j = 0; j < 4; j++)
- line(src, vtx[j], vtx[(j + 1) % 4], Scalar(0, 0, 255), 2, LINE_AA);
- //画出目标物中心到图像原点的直线
- line(src, minRect1.center, Point2f(oriX, oriY), Scalar(0, 255, 0), 1, LINE_AA);
- //目标物距图像原点的X,Y方向的像素距离
- targetImage_X = minRect1.center.x - oriX;
- targetImage_Y = oriY - minRect1.center.y;
- line(src, minRect1.center, Point2f(minRect1.center.x, oriY), Scalar(255, 0, 0), 1, LINE_AA);
- line(src, Point2f(oriX, oriY), Point2f(minRect1.center.x, oriY), Scalar(255, 0, 0), 1, LINE_AA);
- Point2f pointX((oriX + minRect1.center.x) / 2, oriY);
- Point2f pointY(minRect1.center.x, (oriY + minRect1.center.y) / 2);
- //找出最大边
- float a = minRect1.size.height, b = minRect1.size.width;
- if (a < b) a = b;
- mm_per_pixel = targetLength / a; //计算像素尺寸 = 目标物的实际长度(cm)/ 目标物在图像上的像素长度(pixels)
- targetActualX = mm_per_pixel *targetImage_X; //计算实际距离X(cm)
- targetActualY = mm_per_pixel *targetImage_Y; //计算实际距离Y(cm)
- //打印信息在图片上
- String text1 = “X:”+format(“%f”, targetImage_X);
- String text2 = “Y:”+format(“%f”, targetImage_Y);
- putText(src, text1, pointX, FONT_HERSHEY_SIMPLEX, 0.4, Scalar(0, 0, 255), 1, 8);
- putText(src, text2, pointY, FONT_HERSHEY_SIMPLEX, 0.4, Scalar(0, 0, 255), 1, 8);
- String text3 = “Target_X:”+format(“%f”, targetActualX);
- String text4 = “Target_Y:”+format(“%f”, targetActualY);
- putText(src, text3, Point(10,30), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 0, 255), 1, 8);
- putText(src, text4, Point(10,60), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 0, 255), 1, 8);
- }
- break;
- }
- break;
- }
- imshow(“SRC”, src);
- }
完整代码
http://download.csdn.net/download/chenmohousuiyue/9947409
点击打开链接
转载自:https://blog.csdn.net/chenmohousuiyue/article/details/56300915
OpenCV单目视觉定位(测量)系统(新增 含代码)(转载)相关推荐
- OpenCV单目视觉定位(测量)系统(新增 含代码)
OpenCV单目视觉定位(测量)系统 The System of Vision Location with Signal Camera Abstract:This passage mainly des ...
- OpenCV单目视觉定位(测量)系统【转载】
转自https://blog.csdn.net/chenmohousuiyue/article/details/56300915 OpenCV单目视觉定位(测量)系统 The System of Vi ...
- OpenCV单目视觉定位实现方法
OpenCV单目视觉定位(测量)系统 The System of Vision Location with Signal Camera Abstract:This passage mainly des ...
- 使用python和pyqt5轻松上手人脸识别系统(含代码)
使用python和pyqt5轻松上手人脸识别系统(含代码) 一. 环境配置 1.1 python环境配置 1.1.1 安装 anaconda 1.1.2 安装pycharm 1.1.3 配置pip源 ...
- 基于OpenCV的简易实时手势识别(含代码)
基于OpenCV的简易实时手势识别 1.基本信息介绍 1.1实验步骤 1.2效果展示 2.肤色检测+二值化+开运算+高斯模糊 2.1 flip()函数原型 2.2cvtColor()函数原型 2.3s ...
- 基于OpenCV的鱼眼相机畸变矫正(含代码)
首先展示一下实现的效果: 校正前: 校正后: 本文分为两部分,一部分是介绍鱼眼相机畸变校正的原理,一部分是手撕OpenCV相机矫正代码. 文章主要结构如下图所示: 一.介绍鱼眼相机的原理 1.什么是鱼 ...
- C++学生选课系统 【含 代码】
目录 1.系统分析 1.1模块划分 1.2功能模块描述 2.系统设计 [系统流程图] [类图] 3.文件说明 4.测试数据 5.系统效果图[部分] 6.源代码 1.系统分析 本系统的用户分为普通用户和 ...
- 【毕业设计】 微信小程序购物商城系统 【含代码】
文章目录 0 前言 1 开发工具 2 总体架构 3 项目规划 4 云数据库 5 项目解构 5.1 购买首页 5.2 商品详情页 5.3 搜索页 5.4 品牌分类页 5.5 筛选排序页 6 最后 0 前 ...
- OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)
OpenCV与图像处理学习十七--OpenCV人脸检测(含代码) 一.人脸识别概要 1.1 人脸检测 1.2 人脸对齐(Face Alignment) 1.3 人脸特征提取(Face Feature ...
最新文章
- 联泰集群发布水晶系列工作站,用于深度学习场景
- Operations Manager 2007 R2系列之单台性能视图
- Codeforces Round#433 简要题解
- 通过一组RESTful API暴露CQRS系统功能
- 处理之后的图像句柄传到显示框_深度学习目标检测与预处理模块
- 鹅厂后台开发工程师的工作日常
- Java工作笔记-Java函数参传值传引用问题
- jde多目标_《和平精英》PEL职业联赛S3赛季:DKG战队获第四周周冠军,JDE“逆风翻盘”...
- 考研微机原理是计算机基础吗,2015年电子科技大学微机原理与应用考研复试大纲...
- php接dicom,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class
- 项目管理十大过程思维导图
- 软件c#语言调用摄像头,C#中如何使用AForge实现摄像头录像功能
- SLT学习(二)——容器
- python画海贼王_用python自动爬取海贼王漫画推送kindle
- 三菱fx5u plc项目模板程序(含触摸屏程序) 程序注释全面,用的三菱fx5u系列plc和威纶触摸屏
- 律师程海认为北京市办理暂住证行为违法
- 实现舞会上男女舞伴的自动匹配。
- TensorFlow: A System for Large-Scale Machine Learning翻译
- php实现狼和兔子,兔子和狼作文4篇
- mosquitto接口流程图
热门文章
- ZooKeeper管理员指南 部署和管理指南
- 《软件安装》VMware 安装 centos8
- Android BGradualProgress 多种渐变、直角or弧角、进度条、加载条
- 数组(Array)的常用方法
- mac 命令失效问题 命令不存在 : command not found
- 企业文档管理_为什么这么多企业文档如此糟糕?
- 请使用recaptcha_如何在30分钟内使用ReCaptcha和PHP构建Bootstrap电子邮件表单
- 在不如意的世界里全力以赴_我如何在“外展之旅”中全力以赴
- 学生_课程_成绩_教师50个常用sql
- matlab中最接近零的数值