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_Okif (approx.size() == 6){Contour1_Ok.push_back(contours[i]);}//保存逼近五边形的轮廓 到 Contour2_Okelse 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
点击打开链接
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 ...
最新文章
- Google Test(GTest)使用方法和源码解析——自动调度机制分析
- Java 接口 新特性(Java8)
- spring的log4j listener(webAppRootKey)
- excel的快捷键ctrl+;无效
- SpringBoot 自带工具类~断言
- 【C语言笔记初级篇】第三章:函数与递归
- 在iMac上建立一个git仓库
- Eclipse安装git插件以及关联导入GitHub项目
- Python教程_1_引言
- ArcGISEngine二次开发(5):添加矢量要素
- 超级好用又免费的PDF编辑器
- 书剑中医电子处方软件 V16.0
- 链桨PaddleDTX系列 - xdb源码分析(一)
- 相机标定中的四个坐标系
- argument type mismatch
- 中文分词-转载3_一个北京程序员
- java设计中国象棋_Java课程设计—象棋
- 数据库管理工具 FreeSQL
- vue-cli通过symbol引用阿里iconfont图标
- Hibernate注解实现一对一关联
热门文章
- java程序暂停指令_kill命令在Java应用中使用的注意事项小结|chu
- 用 pip show XXX 查询Python安装库的版本等信息
- android h xh xxh 分辨率,android vector入门
- 广州大学大学物理练习6 振动力学
- 【振动理论(振动力学)】不计质量梁上有三个集中质量
- 大连理工计算机管理专业硕士,2018年大连理工大学硕士研究生招生专业一览表...
- RocketMQ源码阅读-NameServer篇
- Linux挂载exfat格式U盘
- 2022-3-30 Leetcode 1133.最大唯一数
- 打造高效、实用的办公神器,360桌面助手有何过人之处?