OpenCV(三):一步步实现图像定位(Python版)

2023-05-16


一、预期目标

如下图,要识别图中的国旗,然后框选出来,并且返回国旗的中心位置,效果如下:
图像定位
彩色图像大小: (400,264)
目标中心位置: (225, 218)


二、准备工作
1、将下面的图像另存为在本地,命名为 findflag.jpg
原始图像
2、新建Python文件 findflag.py,与图像保存在同一目录下。


三、开始编写代码

1、读取与显示图像

# coding:UTF-8
# v1--读取与显示图像
import cv2
import numpy as np

img_bgr = cv2.imread('./findflag.jpg')   #读取图像

cv2.imshow('原始图像', img_bgr)            #显示图像
cv2.waitKey(0)
cv2.destroyAllWindows()

执行python findflag.py,能够正常显示图像
注意OpenCV里面的图像矩阵为 BGR 格式,而不是 RGB

2、根据 HSV 获得目标

# coding:UTF-8
# v2--获取红旗部分
import cv2
import numpy as np

## 图像类型转换
img_bgr = cv2.imread('./findflag.jpg')                  # 读取彩色图像
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)      # 转化为 HSV 格式
thresh1 = np.array([0, 120, 120])                       # 目标红旗的低阈值
thresh2 = np.array([10, 255, 255])                      # 目标红旗的高阈值
img_flag = cv2.inRange(img_hsv, thresh1, thresh2)       # 获取红旗部分
    
cv2.imshow('原始图像', img_bgr)                          #显示图像           
cv2.imshow('红旗图像', img_flag)
cv2.waitKey(0)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 代码中,首先变化为 HSV 格式,因为 HSV 格式更利于做图像处理,具体原因可以参考RGB、HSV和HSL颜色空间。
  • thresh1 的三个变量分别为 H(色度)、S(饱和度)、V(亮度)分量,[thresh1, thresh2] 之间的便是红旗的颜色。
  • cv2.inRange(…) 返回一个图像矩阵(此处:256×400),大于阈值 thresh2 的为255(白色),小于阈值 thresh1 的为0(黑色),中间部分不变。
  • cv2.bitwise_and(…) 函数是将图像进行与运算,使用来掩膜参数 mask,其效果相当于先把掩膜flag 和图像 img_hsv 相成,结果是除了红旗和噪声,其他地方为 0(黑色)。
    红旗部分效果如下,可见成功提取到红旗部分,但是含有少量噪声。
    红旗部分

3、图像滤波

# coding:UTF-8
# v3--形态学滤波
import cv2
import numpy as np

## 图像类型转换
img_bgr = cv2.imread('./findflag.jpg')                  # 读取彩色图像
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)      # 转化为 HSV 格式
thresh1 = np.array([0, 120, 120])                       # 目标红旗的低阈值
thresh2 = np.array([10, 255, 255])                      # 目标红旗的高阈值
img_flag = cv2.inRange(img_hsv, thresh1, thresh2)       # 获取红旗部分
 
## 形态学滤波   
img_morph = img_flag.copy()                             # 复制图像
cv2.erode(img_morph, (3,3), img_morph, iterations= 3)   # 腐蚀运算
cv2.dilate(img_morph, (3,3), img_morph, iterations= 3)  # 膨胀运算

## 显示图像
cv2.imshow('原始图像', img_bgr)                         
cv2.imshow('红旗图像', img_flag)
cv2.imshow('滤波图像', img_morph)
cv2.waitKey(0)
cv2.waitKey(0)
cv2.destroyAllWindows()

此处采用形态学(morphology)滤波算法,首先使用 (3×3)的核腐蚀 3次,然后又膨胀 3次,达到滤波效果,如下图:
滤波图像
4、特征显示

# coding:UTF-8
# v1--读取与显示图像
import cv2
import numpy as np

## 图像类型转换
img_bgr = cv2.imread('./findflag.jpg')                  # 读取彩色图像
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)      # 转化为 HSV 格式
thresh1 = np.array([0, 120, 120])                       # 目标红旗的低阈值
thresh2 = np.array([10, 255, 255])                      # 目标红旗的高阈值
img_flag = cv2.inRange(img_hsv, thresh1, thresh2)       # 获取红旗部分
    
## 形态学滤波
img_morph = img_flag.copy()                             # 复制图像
cv2.erode(img_morph, (3,3), img_morph, iterations= 3)   # 腐蚀运算
cv2.dilate(img_morph, (3,3), img_morph, iterations= 3)  # 膨胀运算


## 获取图像特征
_, cnts, _ = cv2.findContours(img_morph, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 获取图像轮廓
cnts_sort = sorted(cnts, key= cv2.contourArea, reverse= True) # 将轮廓包含面积从大到小排列
box = cv2.minAreaRect(cnts_sort[0])                     # 选取包含最大面积的轮廓,并得出最小外接矩形
points = np.int0(cv2.boxPoints(box))                    # 获得该矩形的四个定点

cen_v = (points[0,0] + points[2,0]) / 2                 # 得出横向中心
cen_h = (points[0,1] + points[2,1]) / 2                 # 得出纵向中心
rows, cols = img_bgr.shape[:2]
print '彩色图像大小: (' + str(cols) + ', ' + str(rows) + ')'
print '目标中心位置: (' + str(cen_h) + ', ' + str(cen_v) + ')'

cv2.drawContours(img_bgr, [points], -1, (255,0,0), 2)         # 在原图上绘制轮廓

## 显示图像  
cv2.imshow('框选图像', img_bgr)                                    
cv2.imshow('红旗图像', img_flag)
cv2.imshow('滤波图像', img_morph)
cv2.waitKey(0)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 其中,cv2.findContours(…) 寻找轮廓,并建立一个等级树结构,记录的轮廓采用压缩值,例如一个矩形只用4点记录。返回各个轮廓只 cnts 中。
  • 然后对各个轮廓从大到小排列,我们选择包含面积最大的轮廓(不一定是轮廓点数最多的),得出其最小外接矩形,这个矩形只用了 4 个点记录,如下图:
    图像模型
  • 接下来计算目标图像中心并显示
  • cv2.drawContours(img_bgr, [points], -1, (255,0,0), 2) 的意思是在图像 img_bgr 上叠加轮廓,轮廓为 points 构成的向量,-1:负数显示所有轮廓,填充颜色为蓝色,宽度为 2像素。

运行即可得到最终结果,如下:
框选图像

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV(三):一步步实现图像定位(Python版) 的相关文章

  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • 萌新学VINS-Fusion(一)------特征跟踪

    VINS FUSION代码心得 新人小白 xff0c 第一次写博客 xff0c 主要相当于自己做一个关于学习VINS的笔记 xff0c 不喜勿喷 xff0c 转载请注明出处 其实我之前也尝试着在VINS MONO基础上改写双目的 xff0c
  • 萌新学VINS-Fusion(二)------初始化

    最近在忙别的事情 xff0c 博客迟迟没更新 xff0c 现在终于放假了 xff0c 今天把初始化部分来分析一下 源码 xff1a https github com HKUST Aerial Robotics VINS Fusion pro
  • c 语言中 %d,%lu等区别

    转载至 xff1a http blog sina com cn s blog 7d94c35c01019f96 html d 有符号10进制整数 ld 长整型 hd短整型 hu 无符号短整形 u无符号整形 lu无符号长整形 i 有符号10进
  • 萌新学VINS-Fusion(三)------双目和GPS融合

    虽然要过年了 xff0c 而且每天还要在家里小店打工 xff0c 但是网红之路不能停对吧 xff0c 这篇博客写关于VINS Fusion和GPS的融合 其实我之前改出过一个加了GPS的VIO xff0c 并且也开源了 xff0c 之前没有
  • nuxt cookie-universal-nuxt 搭配 vuex-persistedstate 做数据持久化

    前言 因为服务端不存在 Local Storage 和 Session Storage 所以 便使用了 cookie universal nuxt 这个插件 在做Nuxt项目的时候 发现Vuex 在刷新页面后 储存的数据丢失 用 vuex
  • ROS学习(一):Navigation中GNSS与IMU数据融合定位

    1 参考博客 主要参考以下博客 感谢各位博主的分享 link https blog csdn net qinqinxiansheng article details 107108475 utm medium 61 distribute pc
  • msOS学习之路(1)

    msOS学习之路 xff08 1 xff09 1 msOS的初步认识 刚刚拿到msOS开发板的时候 xff0c 看了一下开发板 xff0c 感觉非常高端 xff0c 再看一下芯片 xff0c 用的是stm32 当时我就觉得我得先学习stm3
  • msOS学习之路(2)

    基于msOS自动回火机的实现 1 简介 1 1 背景 基于msOS自动回火机的实现的实例是学习msOS比较好的入门实例 xff0c 它包括msOS界面的设计 数据库的使用 系统节拍的使用 按键的使用 系统节拍使用等 xff0c 通过这个例子
  • msOS学习之路(4)

    设备层简单理解 1 设备层相关定义 设备层的相关定义是在device h文件中定义的 xff0c 包括按键 模拟量输入 数字量输入 输出枚举或者类型定义等 xff0c 对于一些结构体的理解 xff0c 例如 xff1a ADC结构体 xff
  • 【STM32】STM32CubeIDE HAL库Ring-buffer例程

    板子G474RE STM32HAL库Ring buffer使用 注意 xff1a HAL库中 xff0c 中断每执行一次 xff0c 就关闭 xff0c 所以需要重新开启中断 第一次开启在main函数中 HAL UART Receive I
  • 【ROS】多机协同ROS安装使用

    目录 通信框架ROS 安装ROS 测试ROS 控制协同 协同感知 通信框架ROS ROS是一种分布式软件框架 xff0c 节点之间通过松耦合的方式进行组合 xff0c 在很多应用场景下 xff0c 节点可以运行在不同的计算平台上 xff0c
  • 【无人机】PX4,ROS,Ubuntu20仿真运行

    参考 xff1a https docs px4 io master en ros mavros installation html https docs px4 io master en dev setup dev env linux ub
  • 【无人机】PX4,源码简要分析

    看看源码目的很单纯 xff0c 就是想有没有控制方面的代码可以移植到其它地方 无人机 PX4 xff0c ubuntu18仿真运行 从官网可能下载代码不全 xff0c 这是编译完成的源码 xff0c 有点大 xff01 xff01 xff0
  • 内核层读写应用层文件,使用filp_open函数。

    转载 xff1a http soft chinabyte com os 421 11398421 shtml 有时候需要在Linux kernel 大多是在需要调试的驱动程序 中读写文件数据 在kernel中操作文件没有标准库可用 xff0
  • 怎样去理解异常SVC和PendSV

    目录 什么是SVC和PendSV 什么是SVC和PendSV SVC xff08 系统服务调用 xff09 和 PendSV xff08 可悬挂系统调用 xff09 它们多用于在操作系统之上的软件开发中 SVC 用于产生系统函数的调用请求
  • vscode开发ROS基本配置订阅PX4中imu数据

    目录 安装vscode Linux版本 安装vscode插件 配置头文件路径 订阅PX4中imu数据 参考 xff1a ROS基本操作 ROS中订阅节点消息测试 ROS下如何订阅任意话题 步步清风皆是你的博客 CSDN博客 安装vscode
  • 执行 install_geographiclib_datasets.sh 错误!

    执行 install geographiclib datasets sh 错误 xff01 原因被墙 xff01 解决 xff1f Ubuntu 18 04 在 usr share 下目录新建 GeographicLib 目录 先将 geo
  • ubuntu查看文件依赖、安装libopencv

    ubuntu查看文件依赖 安装libopencv 1 ubuntu中 xff0c 当需要查看某个文件运行时 xff0c 需要那些依赖库时 xff0c 可以在终端输入指令 ldd name name为文件名字 2 出现libopencv相关依
  • VNC远程连接不上ubuntu服务器,显示time out

    原因 xff1a 可能是出现了wired unmanaged并且启动不了屏幕共享 xff08 screen sharing xff09 xff0c 即开关打不到on上面 解决方案1 xff1a https askubuntu com que
  • OpenCV(三):一步步实现图像定位(Python版)

    一 预期目标 如下图 xff0c 要识别图中的国旗 xff0c 然后框选出来 xff0c 并且返回国旗的中心位置 xff0c 效果如下 彩色图像大小 400 264 目标中心位置 225 218 二 准备工作 1 将下面的图像另存为在本地