opencv-python——基于标志物的道路逆透视变换
文章目录
- 实现效果
- 原图
- 逆透视转换图
- 标定+逆透视变换
- 实时变换效果
因为在做导盲犬的项目,在做导航的过程中需要将雷达与视觉融合在一起,通过视觉得到目标点相对于自身的距离,所以使用逆透视变换就是最好的方案。
实现效果
先上图看效果:
原图
逆透视转换图
这里每个盲道块是25cm,有三个盲道块,经过逆透视变换后我就可以知道图上坐标与真实地面坐标的关系,从而给机器人发送对应的坐标位置,实现视觉的导航。
标定+逆透视变换
'''
Descripttion:
version:
Author: Irving.Gao
Date: 2022-01-11 19:37:42
LastEditors: Irving.Gao
LastEditTime: 2022-01-12 16:00:18
'''
import cv2
import numpy as np
import matplotlib.pyplot as pltdef get_location(img):'''function: 记录标定物体的坐标位置。get location of standard blind path block, the upper edge and lower edge must parallel to standard image.param {img}return {None}''' img[:, :, ::-1] # 是将BGR转化为RGBplt.plot()plt.imshow(img[:, :, ::-1])plt.title('img')plt.show()def get_calibration_params(img, location_corners, block_num=1):'''function: 将记录的标定物体的坐标位置输入,进行逆透视变换。calibrate standard object and get transform matrixparam {img, location_corners}return {img, transform_matrix}'''# 标定# jpg中正方形标定物的四个角点(左上、右上、左下、右下),与变换后矩阵位置standard_loc = np.float32(location_corners)for corner in standard_loc:cv2.circle(img, (int(corner[0]), int(corner[1])), 5, (0,0,255), -1) # 画出标定点坐标l_bot = standard_loc[0]r_bot = standard_loc[1]l_top = standard_loc[2]r_top = standard_loc[3]# 标定物最长边standard_edge = (r_top[0] - l_top[0])center_x = l_top[0] + (r_top[0] - l_top[0])/2center_y = l_top[1] + (r_top[1] - l_bot[1])/2left = center_x - standard_edge/2right = center_x + standard_edge/2bot = center_y - standard_edge*block_num/2top = center_y + standard_edge*block_num/2img_loc = np.float32([[left, bot],[right, bot],[left,top],[right,top]])# 生成透视变换矩阵transform_matrix = cv2.getPerspectiveTransform(standard_loc, img_loc)return img, transform_matrixdef calibration(img, location_corners, block_num=1):'''function: calibrate the img by transform matrix.param {img, location_corners, block_num}return {None}'''img, transform_matrix = get_calibration_params(img, location_corners, block_num)# 逆透视变换calibrated_img = cv2.warpPerspective(img, transform_matrix, (int(img.shape[1]),int(img.shape[0]*block_num)))# 裁剪图片到合适尺寸(该值需要自行根据自己的图像进行测试)# get_location(calibrated_img) # 获取尺寸calibrated_img = calibrated_img[:1750,:]print(calibrated_img.shape)print(transform_matrix)write_matrix(transform_matrix)img = cv2.resize(img, (int(img.shape[1]/2), int(img.shape[0]/2))) cv2.imshow("original_img",img)cv2.imshow("calibrated_img",cv2.resize(calibrated_img, (int(calibrated_img.shape[1]/4), int(calibrated_img.shape[0]/4))))cv2.waitKey(0)cv2.destroyAllWindows()def write_matrix(matrix, save_dir="./"):import osnp.save(os.path.join(save_dir,"transform_matrix.npy"), matrix)if __name__ == '__main__':# 需要哪个注释掉另一个函数即可img = cv2.imread('standard.jpg')# get_location(img) # 利用matplotlib记录标定物四点坐标calibration(img, location_corners=[[511, 71], [700, 71], [342, 709], [823, 709]], block_num=3)transform_matrix = np.load("transform_matrix.npy")print("transform_matrix:", transform_matrix)
实时变换效果
分享不易。觉得好就点个赞把~
参考文章:
- python opencv 前视图转化为鸟瞰图
- 利用逆透视变换获取车载图象的鸟瞰图
- 透视变换原理和变换矩阵的python实现
opencv-python——基于标志物的道路逆透视变换相关推荐
- 机器视觉 OpenCV—python 基于LSTM网络的OCR文本检测与识别
文章目录 一.背景与环境搭建 二.文本检测与识别 一.背景与环境搭建 OpenCV的文本识别流程: OpenCV EAST 文本检测器执行文本检测, 我们提取出每个文本 ROI 并将其输入 Tesse ...
- opencv python 基于分水岭算法的图像分割
Image Segmentation with Watershed Algorithm 理论 任何灰度图像都可以看作是地形表面,其中高强度表示山峰和丘陵,而低强度表示山谷.用不同颜色的水(标签)填充每 ...
- 基于自适应逆透视变换的车道线SLAM
公众号致力于分享点云处理,SLAM,三维视觉,高精地图相关的文章与技术,欢迎各位加入我们,一起每交流一起进步,有兴趣的可联系微信:920177957.本文来自点云PCL博主的分享,未经作者允许请勿转载 ...
- Python基于OpenCV的指针式表盘检测系统(附带源码&技术文档)
1.背景 指针式机械表盘具有安装维护方便.结构简单.防电磁干扰等诸多优点, 目前广泛应用于工矿企业.能源及计量等部门.随着仪表数量的增加及精密仪表技术的发展,人工判读已经不能满足实际应用需求.随着计算 ...
- matlab与逆透视变换,基于逆透视变换的车道线检测方法与流程
本发明属计算机视觉.图形处理技术领域,具体涉及一种通过照度不变及逆透视变换进行车道线快速鲁棒检测的方法. 背景技术: 车道线检测作为自动驾驶技术的第一个环节,能够有效感知车辆周围世界,并获取可行驶区域 ...
- Python基于OpenCV&ORB和特征匹配的双视频图像拼接(源码&部署教程)
1.双视频拼接效果展示 2.视频演示 [项目分享]Python基于OpenCV&ORB和特征匹配的双视频图像拼接(源码&部署教程)_哔哩哔哩_bilibili 3.背景 随着汽车电子和 ...
- OpenCV + python 实现人脸检测(基于照片和视频进行检测)
OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...
- Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示
Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + openc ...
- Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM)
Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM) dsize = 20 affine_flags = lmc_cv.WARP ...
- Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN)
Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN) OCR of Hand-written Digits ########## ...
最新文章
- 【攻防世界011】Windows_Reverse1
- 教室信息管理系统mysql_教师信息管理系统(方式一:数据库为oracle数据库;方式二:存储在文件中)...
- python字典遍历 没有顺序_Python中字典的顺序问题(为什么实践发现字典的遍历和方法popitem并不是随机的?)...
- 对战 | RabbitMq 大战 kafka
- 查看数据库开了inodb_Mysql中查看表的类型InnoDB
- 48. Element isSupported() 方法
- 由一次NoHttpResponseException异常,追究到Http长连接和短连接
- Java代码整洁之道
- Smart3D系列教程5之 《案例实战演练2——大区域的地形三维重建》
- java rnn生成古诗_基于循环神经网络(RNN)的古诗生成器
- 正点原子STM32(基于HAL库)2
- 带云的计算机词语,带云字的词语和成语有哪些
- PnL Explained FAQ
- 杂记二 · 永远不服输
- MySQL 报错:Could not acquire management access for administration 不能正确登录怎么办?
- RobotFramework中,选择注释套件中的某些用例的方法(主要用于RED/IntelliBot从套件执行单个用例)
- CES Aisa总结篇|盛况依旧,却始终缺了点新意和真实落地的感觉
- $Self~Problem~C~:~Samsara$
- 【Linux】进程概念 —— 进程状态
- 保险公司真得保险么?
热门文章
- 小鑫の日常系列故事(五)——卡片游戏
- ipad和iphone切图_如何在iPhone和iPad上使用触控板模式选择文本
- 基于Docker-compose编排部署sentiment-analyzer情感分析系统(老保姆级讲解-部署)
- EXCEL姓名转换为拼音缩写
- springcloud5-服务网关zuul及gateway
- springcloud3-服务到服务调用ribbon及openfeign
- html5 励志名言,5个字的励志名言
- 高压开关柜无线测温系统(高压开关柜在线监测系统应用案例)
- 理解Room数据库的迁移(Migration)
- 新浪微博批量取消关注