轮廓检测及功能

news2024/11/25 16:29:55

目录

    • 一、实验介绍
    • 二、实验步骤
    • 三、实验任务
      • 任务一:轮廓特征
      • 练习一: 找到每个轮廓的方向
      • 任务二:边界矩形
      • 练习二: 围绕轮廓裁剪图像

一、实验介绍

1. 实验内容

本实验将学习轮廓检测及功能。

2. 实验要点

  • 生成二进制图像来查找轮廓
  • 找到并画出轮廓
  • 轮廓特征
  • 边界矩形

3. 实验环境

  • Python 3.6.6
  • numpy
  • matplotlib
  • cv2

二、实验步骤

1 导入资源并显示图像

import numpy as np
import matplotlib.pyplot as plt
import cv2

%matplotlib inline

# 读入图像
image = cv2.imread('images/thumbs_up_down.jpg')

# 将颜色更改为RGB(从BGR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

plt.imshow(image)
<matplotlib.image.AxesImage at 0x7feef4377160>

在这里插入图片描述

2 生成二进制图像来查找轮廓

# 转换为灰度
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)

# 创建一个二进制阈值图像
retval, binary = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)

plt.imshow(binary, cmap='gray')

<matplotlib.image.AxesImage at 0x7feea070c400>

在这里插入图片描述

3 找到并画出轮廓

# 从带阈值的二进制图像中查找轮廓

retval,contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 在原始图像的副本上绘制所有轮廓
contours_image = np.copy(image)
contours_image = cv2.drawContours(contours_image, contours, -1, (0,255,0), 3)

plt.imshow(contours_image)
<matplotlib.image.AxesImage at 0x7feea0676518>

在这里插入图片描述

三、实验任务

任务一:轮廓特征

每个轮廓都有许多可以计算的特征,包括轮廓的面积,它的方向(大部分轮廓指向的方向),它的周长,以及OpenCV documentation, here中概述的许多其他属性。

在下一个单元格中,要求标识左右轮廓的方向。明确手的方向,让你知道哪只手的拇指向上,哪只手的拇指向下!

方向:

对象的方向是对象指向的角度。 要找到轮廓的角度,首先应找到适合轮廓的椭圆,然后从该形状中提取角度

# Fit an ellipse to a contour and extract the angle from that ellipse
(x,y), (MA,ma), angle = cv2.fitEllipse(selected_contour)

方向值

这些取向值以度为单位,从x轴测量。 值为零表示平直线,值为90表示轮廓指向直线!

因此,每个轮廓计算的方向角应该能够告诉我们关于手的一般位置的信息。 用拇指向上的手应该比用拇指向下的手更高(接近90度)。

练习一: 找到每个轮廓的方向

## TODO: 完成此功能,以便
## 返回轮廓列表的方向
## 列表应与轮廓顺序相同
## 即第一个角度应该是第一个轮廓的方向
def orientations(contours):
    """
    方向 
    :参数轮廓: 轮廓列表
    :返回值: 角度,轮廓的方向
    """
    
    # 创建一个空列表以存储角度
    # 提示:使用angles.append(value)将值添加到此列表中
    angles = []
    for contour in contours:
        # 拟合椭圆
        ellipse = cv2.fitEllipse(contour)
        # 提取角度
        angle = ellipse[2]
        angles.append(angle)

    return angles


# ---------------------------------------------------------- #
# 打印方向值
angles = orientations(contours)
print('Angles of each contour (in degrees): ' + str(angles))


Angles of each contour (in degrees): [61.35833740234375, 82.27550506591797]

任务二:边界矩形

在下一个单元格中,系统将要求您在* left *手轮廓周围找到边界矩形,该轮廓已将其拇指向上,然后使用该边界矩形裁剪图像并更好地集中在那只手上!

# 查找选定轮廓的边界矩形
x,y,w,h = cv2.boundingRect(selected_contour)

# 将边界矩形绘制为紫色框
box_image = cv2.rectangle(contours_image, (x,y), (x+w,y+h), (200,0,200),2)

要裁剪图像,请选择要包含的图像的正确宽度和高度。

# 使用边界矩形(x,y,w,h)的尺寸进行裁剪
cropped_image = image[y: y + h, x: x + w] 

练习二: 围绕轮廓裁剪图像

## TODO: 完成此功能,以便
## 它会返回原始图像的新裁剪版本
def left_hand_crop(image, selected_contour):
    """
    Left hand crop 
    :参数图像:原始图像
    :参数selectec_contour:将用于裁剪的轮廓
    :返回值: cropped_image, 左手周围的裁剪图像
    """
    
    ## TODO: 检测左手轮廓的边界矩形
    
    x, y, w, h = cv2.boundingRect(selected_contour)
    box_image = cv2.rectangle(contours_image, (x,y), (x+w,y+h), (200,0,200),2)
    
    ## TODO: 使用边界矩形的尺寸裁剪图像
    # 复制图像进行裁剪
    
    cropped_image = np.copy(box_image)
    cropped_image = box_image[y: y + h, x: x + w]
    
    return cropped_image


## TODO: 从列表中选择左侧轮廓
## 替换此值
selected_contour = contours[1]


# ---------------------------------------------------------- #
# 如果选择了轮廓
if(selected_contour is not None):
    # 调用带有该轮廓的裁剪函数作为参数
    cropped_image = left_hand_crop(image, selected_contour)
    plt.imshow(cropped_image)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试题--12

1.MySQL 的内连接、左连接、右连接有什么区别&#xff1f; 2.MySQL 索引是怎么实现的&#xff1f; 3.索引的优点和缺点—查询频率高的字段 4.B树的特点和作用----必须先看 下面的网址 5.什么是聚集索引和非聚集索引 6.索引的分类 7.什么是最左前缀法则以及如何设计最左法则 8.怎…

图论基础和表示

一、概念及其介绍 图论(Graph Theory)是离散数学的一个分支&#xff0c;是一门研究图(Graph)的学问。 图是用来对对象之间的成对关系建模的数学结构&#xff0c;由"节点"或"顶点"(Vertex&#xff09;以及连接这些顶点的"边"&#xff08;Edge&a…

chatgpt赋能python:Python开源免费——为什么它是SEO世界的最佳选择

Python开源免费——为什么它是SEO世界的最佳选择 介绍 Python是一种流行的程序设计语言&#xff0c;拥有众多的开源库和响应式社区。它广泛应用于机器学习、数据科学、Web开发、系统自动化等领域。Python不仅易于学习和使用&#xff0c;而且完全免费并且开源&#xff0c;使得…

Linux线程的同步与互斥(二) 条件变量+信号量

文章目录 二、线程同步条件变量1、条件变量的概念2、同步概念与竞态条件3、条件变量函数初始化4、条件变量函数销毁5、条件变量函数等待6、条件变量函数唤醒等待生产者消费者模型1、理论部分2、“3 2 1”原则3、基于阻塞队列的生产者消费者模型 POSIX信号量1、信号量的概念2、信…

时间序列学习 经典案例(5)【stability_selection】股票数据特征分析与特征选择

0.环境配置 本文用到的环境是&#xff1a; jupyter 略python 3.9stability_selection 略&#xff0c;见下文。scikit-learn 1.2.2seaborn 0.12.2pandas 1.3.5numpy 1.22.3matplotlib 3.6.3tushare 1.2.89baostock 00.8.80yfinance 0.2.18 1.stability_selection模块安装【问…

【MySQL数据库 | 番外篇】 聚合函数

前言&#xff1a; 聚合函数是分组查询中一个重要的组成部分&#xff0c;想要利用分组查询&#xff0c;就要对聚合函数有不错的掌握&#xff0c;因此我们在这里开一篇番外&#xff0c;讲解SQL语法中的聚合函数 聚合函数&#xff1a; 聚合函数是SQL中一种特殊的函数&#xff0c;…

大模型信息提取、文本生成、视觉语音应用

448页新书《基础模型自然语言处理》&#xff0c;详述大模型在信息提取文本生成视觉语音应用。 Dr. Gerhard Paa 等人合著的《Foundation Models for Natural Language Processing》 一书系统介绍基础模型研究和应用的全面概述&#xff0c;而且是目前对此方面研究最新的综述。 …

【Java】Java核心要点总结:59

文章目录 1. 线程的run()和start()有什么区别&#xff0c;为什么不直接调用run()2. synchronized是什么&#xff0c;以及原理3. Java中如何实现多线程的通讯和协作4. Volatile有什么特点&#xff0c;为什么能够保证变量的可见性5. 为什么说synchronized是一个悲观锁&#xff0c…

chatgpt赋能python:Python开发环境的下载方法

Python开发环境的下载方法 Python是一种高级的编程语言&#xff0c;受到广泛的社区和商业支持。它用于数据分析、人工智能和Web开发等领域&#xff0c;成为业界最流行的编程语言之一。搭建Python开发环境需要安装解释器、编辑器、包管理器和库&#xff0c;下面介绍Python开发环…

chatgpt赋能python:用Python开发在线电影播放网站如何进行SEO

用Python开发在线电影播放网站如何进行SEO 随着人们对于电影、电视剧等视频娱乐的需求日益增长&#xff0c;越来越多的在线电影播放网站涌现出来。作为开发者&#xff0c;如何通过搜索引擎优化&#xff08;SEO&#xff09;来使你的在线电影播放网站具有更好的可见度&#xff0…

chatgpt赋能python:如何更新Python库?

如何更新Python库&#xff1f; Python语言已经成为现代编程语言中最受欢迎的一种&#xff0c;它的成功归功于它的灵活性、简洁性和可读性。Python库是它成功的关键&#xff0c;这些库是程序员的基本工具箱&#xff0c;可以更快地编写、测试和部署程序。 然而&#xff0c;Pyth…

多分类问题

目录 多分类问题介绍1 多分类1.1 数据集1.2 数据可视化1.3 逻辑回归的向量化1.3.1 代价函数的向量化1.3.2 梯度的向量化1.3.3 正则化逻辑回归的向量化 1.4 多分类-分类器 1.5 使用分类器进行预测 多分类问题 介绍 在本练习中&#xff0c;我们将使用逻辑回归来识别手写数字&…

python安装使用Flask框架(Vscode)

编译器&#xff1a;VsCode&#xff0c;python3.** 首先安装&#xff0c;在终端输入 pip install flask安装成功后新建文件&#xff0c;app.python&#xff0c;创建一个简单的Web应用。 from flask import Flaskapp Flask(__name__)app.route(/) def hello():return Hello, …

chatgpt赋能python:Python平均值命令在数据处理中的应用

Python平均值命令在数据处理中的应用 Python是一门广泛应用于数据分析和数据处理的编程语言。在数据处理中&#xff0c;我们常常需要计算数据的平均值。Python中提供了多种方法来计算平均值&#xff0c;比如使用内置函数mean()或使用numpy库中的mean()函数等。本文将着重介绍P…

Vue封装API,详细解释。

1、为什么我们要封装API ps: 如果已经有了明确要封装API的需求&#xff0c;直接看第二步。 在没有封装API之前&#xff0c;我们是类似这样使用 axios 的 this.$axios.post(blogArticle/frontList,parms).then((resp) > { this.blogList resp.data, this.blogTota…

【玩转Linux操作】Linux常用文件管理命令

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 目录 ​编辑 &#x1f381;ctrlc &#x1f381;ctrlu &#x1f381;t…

chatgpt赋能python:Python平均分函数:简介和使用方法

Python平均分函数&#xff1a;简介和使用方法 如果您正在寻找如何计算Python中多个数字值的平均分数的方法&#xff0c;请继续阅读。本文将为您介绍Python中平均分函数的用途和使用方法。 什么是平均分函数&#xff1f; Python的平均分函数是一个计算多个数字值的平均值的函…

分享可以在线录音实时转写的方法

小伙伴们使用过录音记录吗&#xff1f;那知道录音实时转写吗&#xff1f;有没有听说过这个功能呢&#xff1f;它是可以通过语音识别技术&#xff0c;将录音中的信息快速转换为文本&#xff0c;并实现实时显示输出的功能。听起来是不是很有趣&#xff1f;而且它无需任何专业设备…

线程,你是个什么?

线程的基本定义 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程&#xff08;Process&#xff09;中&#xff0c;是进程中的实际运作单位。一个线程可以与同一进程中的其他线程共享进程的全部资源&#xff0c;包括内存、文…

深入浅出讲解闭包及其原理

闭包 什么是闭包&#xff1f; 闭包的概念并不复杂&#xff0c;但是它的定义比较绕&#xff08;就像平时经常用到它&#xff0c;却又说不出来是什么&#xff09;。可以在一个作用域中调用函数的内部函数并访问到该函数中的作用域的成员&#xff0c;这就是闭包。给一个建议&…