OpenCV—PnP单目测距

使用单目相机结合OpenCV的pnp解算实现单目测距(需要知道物体的长宽)
开始用的opencv 自带的标定api 标定相机,但是标定结果和matlab的结果有出入,可能我没用对吧,后面就用的Matlab 标定工具箱的标定结果,大概误差1 ~2cm吧,毕竟近距离。

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;void drawRotatedRect(cv::Mat &img, const cv::RotatedRect &rect, const cv::Scalar &color, int thickness)
{cv::Point2f Vertex[4];rect.points(Vertex);for(int i = 0 ; i < 4 ; i++){cv::line(img , Vertex[i] , Vertex[(i + 1) % 4] , color , thickness);}
}
void getTarget2dPoints(cv::RotatedRect object_rect,std::vector<Point2f> &object2d_point)
{cv::Point2f vertices[4];object_rect.points(vertices);cv::Point2f lu, ld, ru, rd;std::sort(vertices, vertices + 4, [](const cv::Point2f & p1, const cv::Point2f & p2) { return p1.x < p2.x; });if (vertices[0].y < vertices[1].y) {lu = vertices[0];ld = vertices[1];} else {lu = vertices[1];ld = vertices[0];}if (vertices[2].y < vertices[3].y) {ru = vertices[2];rd = vertices[3];} else {ru = vertices[3];rd = vertices[2];}object2d_point.clear();object2d_point.push_back(lu);object2d_point.push_back(ru);object2d_point.push_back(rd);object2d_point.push_back(ld);
}
int iLowH = 156;
int iHighH = 180;
int iLowS = 43;
int iHighS = 255;
int iLowV = 46;
int iHighV = 255;
int main()
{VideoCapture cap;cap.open(1);Mat frame;Mat gray;Mat binImg;Mat hsv_img;Mat imgThresholded;while(true){cap >>frame;cvtColor(frame,gray,COLOR_BGR2GRAY);threshold(gray,binImg,40,255,THRESH_BINARY_INV);vector<vector<cv::Point>> bin_contours;cvtColor(frame, hsv_img, COLOR_BGR2HSV);inRange(hsv_img, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image
//        blur(imgThresholded,imgThresholded,Size(5,5));//开操作 (去除一些噪点)  如果二值化后图片干扰部分依然很多,增大下面的sizeMat element = getStructuringElement(MORPH_RECT, Size(5, 5));morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);//闭操作 (连接一些连通域)morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);erode(imgThresholded,imgThresholded,element);binImg = imgThresholded;cv::findContours(binImg,bin_contours,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);for (uint i = 0;i < bin_contours.size();i++){cv::RotatedRect RRect = minAreaRect(bin_contours[i]);if (RRect.size.area()<200 || RRect.size.area()>100000)continue;if (max(RRect.size.width,RRect.size.height) / min(RRect.size.width,RRect.size.height) > 1.3)continue;drawRotatedRect(frame,RRect,cv::Scalar(255,0,0),2);//画出最小旋转矩形Mat rot_vector,translation_vector;vector<Point2f> object2d_point;getTarget2dPoints(RRect, object2d_point);std::vector<cv::Point3f> point3d;float half_x = 2.6f/2.0f;float half_y = 3.4f/2.0f;  //height_target / 2.0;point3d.push_back(Point3f(-half_x, half_y, 0));point3d.push_back(Point3f(half_x, half_y, 0));point3d.push_back(Point3f(half_x, -half_y, 0));point3d.push_back(Point3f(-half_x, -half_y, 0));cv::Mat rot;cv::Mat trans;Mat cam_matrix = (Mat_<double>(3,3)<<578.6274,0,334.7460, 0, 576.9578, 214.0938, 0, 0, 1);//1981.3, -6.2, 684, 0, 2006.7, 504, 0, 0, 1Mat distortion_coeff = (Mat_<double>(5,1)<<-0.4290,  0.2780,  0,  0,  0);//-0.1029, 0.0058, -0.0030, 0.0047,0cv::solvePnP(point3d, object2d_point, cam_matrix, distortion_coeff, rot, trans);double tx = trans.at<double>(0,0);double ty = trans.at<double>(1,0);double tz = trans.at<double>(2,0);double dis  =sqrt(tx*tx+ty*ty+ tz*tz);cout<<"dis:"<<dis<<endl;putText(frame,to_string(dis)+"cm",Point(50,50),1,2,Scalar(0,255,100),2);}imshow("1",frame);imshow("2",imgThresholded);if (waitKey(10)=='q')break;}
}


OpenCV—PnP单目测距相关推荐

  1. C++使用opencv实现单目测距

    目录 前言 原理 实现步骤 效果演示 实现代码 边缘检测算法测试 效果演示 前言 闲来无事,用C++做了一个简易的单目测距.算法用的cv自带的,改改参数就行.实现了读取照片测距,读取笔记本摄像头测距, ...

  2. 基于OPENCV的单目测距

    最近研究了一下单目测距,关于单目测距的原理有各位大神的讲解,这里只写一些自已使用上的记录,使用环境为windows10+opencv3.1+vs2015. 买了一个摄像头(笔记本的定焦摄像头也可以), ...

  3. Opencv视觉学习--单目测距

    对于刚开始学习Opencv的朋友们,查找资料是自学最好的方式. 这一篇博客,我将介绍Opencv单目测距的操作,如有问题或建议可留言于我,谢谢! 更多资料请点击:我的目录 单目测距需要用到四个参数: ...

  4. OpenCV实现单目摄像头对图像目标测距

    使用opencv对单目摄像头中的目标实现测量距离(python实现) 1.方法介绍: 根据相似三角形的方法: F = P×D / W , 其中W为物体的实际宽度,D为物体平面与相机平面的距离,照片上物 ...

  5. 基于OpenCV的单目相机标定与三维定位

    相机是产生图像数据的硬件,广泛应用于消费电子.汽车.安防等领域.围绕着相机衍生出一系列的研究与应用领域,包括传统的图像处理和基于深度学习的智能应用等.目前大火的自动驾驶中相机也是重要的硬件组成,如环视 ...

  6. 单目视觉系统检测车辆的测距方法(Mobileye单目测距等7种方法)

    作者:CV_Community 来源:计算机视觉社区 本文还是在传统机器视觉的基础上讨论单目测距,深度学习直接估计深度图不属于这个议题,主要通过mobileye的论文管中窥豹,相信离实际工程应用还有很 ...

  7. opencv 图像上画出目标运动的轨迹_基于opencv的单目和双目标定平台手眼标定

      背景介绍 基于机器视觉引导的智能机器人,在现代社会各个领域已经得到了广泛的应用,尤其是大型工厂的自动化生产线上,视觉机器人可以和基于示教器按照预定轨迹进行作业的机器人互为补充,来共同提高生产的自动 ...

  8. 自动驾驶(二十一)---------Mobileye单目测距

    本文还是在传统机器视觉的基础上讨论单目测距,深度学习直接估计深度图不属于这个议题,主要通过mobileye的论文管中窥豹,相信离实际工程应用还有很远. mobileye2003年的论文:Vision- ...

  9. 基于OpenCV的单目摄像机测距

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|新机器视觉 我的论文方向目前是使用单目摄像头实现机器人对人 ...

最新文章

  1. php-curl小记
  2. org 07c00h的原因
  3. Linux服务器rsync自动备份
  4. IntelliJ IDEA 2020.1 快速查找文件
  5. Base ui 纯as3的ui
  6. 快速排序实现(附原理参考资料和代码实现关键点描述)
  7. 二分查找时间复杂度分析
  8. Open***+ldap配置过程
  9. 南京趋势科技面试归来
  10. ubuntu 18.04 设置静态IP地址
  11. 从零开始搭建一个自己的脚手架
  12. 英语音标真的分得清楚?KK IPA DJ
  13. 一看就懂【来自英雄联盟盖伦的怒吼】与 Python 详解设计模式(二)观察者模式...
  14. NFC Antenna Tool,便捷的 NFC 电路 和 NFC 线圈设计工具
  15. (适配方案总结)客户薅公司两台ipad,我还要给做适配?
  16. 事件抽取文献整理(2018)
  17. 深入了解电容(三):陶瓷电容MLCC
  18. html5 ios keychain,iOS10适配之Keychain读写失败
  19. 杭州SEO每天一研究——网站SEO必须解决的4大问题
  20. [智能座舱]小鹏G9语音新功能介绍与分析

热门文章

  1. ASH、AWR、ADDM区别联系
  2. Linux 初学者:如何在 Ubuntu 中重启网络
  3. NOIP2011计算系数详解
  4. 不再摆烂,浅谈做本地生活如何选择靠谱服务商,少走弯路
  5. Excel行高、列宽怎么调整?
  6. 集合论——集合表示方法,关系及特殊集合
  7. 宝宝感冒用药记录-仅供参考
  8. mysql的union和union all
  9. 海康摄像头--通过WEB浏览器方式查看
  10. Hexo个人免费博客(四) 部署到Coding.net