返回顶部
首页 > 资讯 > 后端开发 > Python >详解Python使用OpenCV如何确定一个对象的方向
  • 840
分享到

详解Python使用OpenCV如何确定一个对象的方向

2024-04-02 19:04:59 840人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.代码实现2.输出图像3.了解坐标轴4.计算0到180度之间的方向在本教程中,我们将构建一个程序,该程序可以使用流行的计算机视觉库 OpenCV 确定对象的方向(即以度为单位的

在本教程中,我们将构建一个程序,该程序可以使用流行的计算机视觉库 OpenCV 确定对象的方向(即以度为单位的旋转角度)。

最常见的现实世界用例之一是当您想要开发机械臂的取放系统时。确定一个物体在传送带上的方向是确定合适的抓取、捡起物体并将其放置在另一个位置的关键。

1.代码实现

接受一个名为input_img.jpg的图像,并输出一个名为output_img.jpg的带标记的图像。部分代码来自官方的OpenCV实现。

import cv2 as cv
from math import atan2, cos, sin, sqrt, pi
import numpy as np
 
def drawAxis(img, p_, q_, color, scale):
  p = list(p_)
  q = list(q_)
 
  ## [visualization1]
  angle = atan2(p[1] - q[1], p[0] - q[0]) # angle in radians
  hypotenuse = sqrt((p[1] - q[1]) * (p[1] - q[1]) + (p[0] - q[0]) * (p[0] - q[0]))
 
  # Here we lengthen the arrow by a factor of scale
  q[0] = p[0] - scale * hypotenuse * cos(angle)
  q[1] = p[1] - scale * hypotenuse * sin(angle)
  cv.line(img, (int(p[0]), int(p[1])), (int(q[0]), int(q[1])), color, 3, cv.LINE_AA)
 
  # create the arrow hooks
  p[0] = q[0] + 9 * cos(angle + pi / 4)
  p[1] = q[1] + 9 * sin(angle + pi / 4)
  cv.line(img, (int(p[0]), int(p[1])), (int(q[0]), int(q[1])), color, 3, cv.LINE_AA)
 
  p[0] = q[0] + 9 * cos(angle - pi / 4)
  p[1] = q[1] + 9 * sin(angle - pi / 4)
  cv.line(img, (int(p[0]), int(p[1])), (int(q[0]), int(q[1])), color, 3, cv.LINE_AA)
  ## [visualization1]
 
def getOrientation(pts, img):
  ## [pca]
  # Construct a buffer used by the pca analysis
  sz = len(pts)
  data_pts = np.empty((sz, 2), dtype=np.float64)
  for i in range(data_pts.shape[0]):
    data_pts[i,0] = pts[i,0,0]
    data_pts[i,1] = pts[i,0,1]
 
  # PerfORM PCA analysis
  mean = np.empty((0))
  mean, eigenvectors, eigenvalues = cv.PCACompute2(data_pts, mean)
 
  # Store the center of the object
  cntr = (int(mean[0,0]), int(mean[0,1]))
  ## [pca]
 
  ## [visualization]
  # Draw the principal components
  cv.circle(img, cntr, 3, (255, 0, 255), 2)
  p1 = (cntr[0] + 0.02 * eigenvectors[0,0] * eigenvalues[0,0], cntr[1] + 0.02 * eigenvectors[0,1] * eigenvalues[0,0])
  p2 = (cntr[0] - 0.02 * eigenvectors[1,0] * eigenvalues[1,0], cntr[1] - 0.02 * eigenvectors[1,1] * eigenvalues[1,0])
  drawAxis(img, cntr, p1, (255, 255, 0), 1)
  drawAxis(img, cntr, p2, (0, 0, 255), 5)
 
  angle = atan2(eigenvectors[0,1], eigenvectors[0,0]) # orientation in radians
  ## [visualization]
 
  # Label with the rotation angle
  label = "  Rotation Angle: " + str(-int(np.rad2deg(angle)) - 90) + " degrees"
  textbox = cv.rectangle(img, (cntr[0], cntr[1]-25), (cntr[0] + 250, cntr[1] + 10), (255,255,255), -1)
  cv.putText(img, label, (cntr[0], cntr[1]), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1, cv.LINE_AA)
 
  return angle
 
# Load the image
img = cv.imread("input_img.jpg")
 
# Was the image there?
if img is None:
  print("Error: File not found")
  exit(0)
 
cv.imshow('Input Image', img)
 
# Convert image to grayscale
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
 
# Convert image to binary
_, bw = cv.threshold(gray, 50, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
 
# Find all the contours in the thresholded image
contours, _ = cv.findContours(bw, cv.RETR_LIST, cv.CHaiN_APPROX_NONE)
 
for i, c in enumerate(contours):
 
  # Calculate the area of each contour
  area = cv.contourArea(c)
 
  # Ignore contours that are too small or too large
  if area < 3700 or 100000 < area:
    continue
 
  # Draw each contour only for visualisation purposes
  cv.drawContours(img, contours, i, (0, 0, 255), 2)
 
  # Find the orientation of each shape
  getOrientation(c, img)
 
cv.imshow('Output Image', img)
cv.waiTKEy(0)
cv.destroyAllwindows()
  
# Save the output image to the current directory
cv.imwrite("output_img.jpg", img)

2.输出图像

3.了解坐标轴

红线表示每个物体的正x轴。蓝线表示每个物体的正y轴。

全局正x轴从左到右横贯图像。整体正z轴指向这一页外。全局正y轴从图像的底部垂直指向图像的顶部。

使用右手法则来测量旋转,你将你的四个手指(食指到小指)笔直地指向全局正x轴的方向。

然后逆时针旋转四个手指90度。指尖指向y轴正方向,大拇指指向纸外z轴正方向。

4.计算0到180度之间的方向

如果我们想计算一个对象的方向,并确保结果总是在0到180度之间,我们可以使用以下代码:

# This programs calculates the orientation of an object.
# The input is an image, and the output is an annotated image
# with the angle of otientation for each object (0 to 180 degrees)
 
import cv2 as cv
from math import atan2, cos, sin, sqrt, pi
import numpy as np
 
# Load the image
img = cv.imread("input_img.jpg")
 
# Was the image there?
if img is None:
  print("Error: File not found")
  exit(0)
 
cv.imshow('Input Image', img)
 
# Convert image to grayscale
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
 
# Convert image to binary
_, bw = cv.threshold(gray, 50, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
 
# Find all the contours in the thresholded image
contours, _ = cv.findContours(bw, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
 
for i, c in enumerate(contours):
 
  # Calculate the area of each contour
  area = cv.contourArea(c)
 
  # Ignore contours that are too small or too large
  if area < 3700 or 100000 < area:
    continue
 
  # cv.minAreaRect returns:
  # (center(x, y), (width, height), angle of rotation) = cv2.minAreaRect(c)
  rect = cv.minAreaRect(c)
  box = cv.boxPoints(rect)
  box = np.int0(box)
 
  # Retrieve the key parameters of the rotated bounding box
  center = (int(rect[0][0]),int(rect[0][1])) 
  width = int(rect[1][0])
  height = int(rect[1][1])
  angle = int(rect[2])
 
     
  if width < height:
    angle = 90 - angle
  else:
    angle = -angle
         
  label = "  Rotation Angle: " + str(angle) + " degrees"
  textbox = cv.rectangle(img, (center[0]-35, center[1]-25), 
    (center[0] + 295, center[1] + 10), (255,255,255), -1)
  cv.putText(img, label, (center[0]-50, center[1]), 
    cv.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,0), 1, cv.LINE_AA)
  cv.drawContours(img,[box],0,(0,0,255),2)
 
cv.imshow('Output Image', img)
cv.waitKey(0)
cv.destroyAllWindows()
  
# Save the output image to the current directory
cv.imwrite("min_area_rec_output.jpg", img)

到此这篇关于详解python使用OpenCV如何确定一个对象的方向的文章就介绍到这了,更多相关Python OpenCV确定对象方向内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Python使用OpenCV如何确定一个对象的方向

本文链接: https://lsjlt.com/news/120818.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Python使用OpenCV如何确定一个对象的方向
    目录1.代码实现2.输出图像3.了解坐标轴4.计算0到180度之间的方向在本教程中,我们将构建一个程序,该程序可以使用流行的计算机视觉库 OpenCV 确定对象的方向(即以度为单位的...
    99+
    2024-04-02
  • 如何使用Python面向对象做个小游戏
    这篇文章主要讲解了“如何使用Python面向对象做个小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Python面向对象做个小游戏”吧!我们今天同样实现一个小游戏,这个小游戏非常...
    99+
    2023-06-15
  • 如何正确的使用HttpServletRequest对象方法
    这篇文章将为大家详细讲解有关如何正确的使用HttpServletRequest对象方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。深入体验JavaWeb开发内幕——关于HttpServle...
    99+
    2023-05-31
    httpservletrequest ue
  • Python 中如何实现对象的重定向?
    Python 中的对象重定向是一种非常有用的技术,可以帮助开发者更加高效地编写代码。在本文中,我们将详细介绍 Python 中如何实现对象的重定向,并提供一些演示代码帮助读者更好地理解。 什么是对象重定向? 在 Python 中,每个对象都...
    99+
    2023-07-24
    重定向 对象 同步
  • 如何使用 Python 实现同步对象的重定向操作?
    同步对象是多线程编程中的重要概念,它可以帮助我们在多个线程之间同步数据,避免出现竞争条件。在 Python 中,常用的同步对象包括 Lock、Semaphore、Condition 等。本文将介绍如何使用 Python 实现同步对象的重定...
    99+
    2023-07-24
    重定向 对象 同步
  • 如何在TypeScript中正确的遍历一个对象
    目录JavaScriptTypeScriptfor...inObject.keysObject.entries思考总结JavaScript 在讲解用 Ts 遍历一个对象之前, 我们先...
    99+
    2024-04-02
  • Linux 中如何使用 Java 对象实现重定向和对象传递?
    在 Linux 上使用 Java 开发程序时,经常需要实现重定向和对象传递。本文将介绍如何使用 Java 对象实现重定向和对象传递,并提供相应的演示代码。 重定向 重定向是指将程序的输出从标准输出流(System.out)转向其他输出流,...
    99+
    2023-10-10
    重定向 linux 对象
  • Linux 下如何使用 Java 对象进行重定向?
    在 Linux 下,Java 应用程序常常需要进行文件的输入输出操作,而在实际应用中,我们经常需要将输出结果重定向到文件中,以便后续的处理。本文将介绍如何使用 Java 对象进行重定向操作,并给出相关的代码实例。 一、使用 System....
    99+
    2023-10-10
    重定向 linux 对象
  • 详解python  OpenCV如何使用背景分离方法
    目录目标理论实现代码分析结果目标 在本章中,将学习: 背景分离(Background Subtraction)OpenCv函数cv2.VideoCapture, cv2.Backgr...
    99+
    2023-05-17
    python OpenCV背景分离 python OpenCV
  • 如何解决php对象参数不确定的问题
    小编给大家分享一下如何解决php对象参数不确定的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!php对象参数不确定的时候需要改变一下写法,修改后的代码如“function uncertainParam() {$args...
    99+
    2023-06-26
  • 如何使用Python中的面向对象设计模式
    如何使用Python中的面向对象设计模式,需要具体代码示例概述:在Python编程中,面向对象设计模式是非常重要的一个概念。它提供了一种结构化的方法来解决问题,并使得代码更易于理解、维护和扩展。本文将介绍几种常见的面向对象设计模式,并提供具...
    99+
    2023-10-22
    Python 设计模式 面向对象
  • Java中如何使用对象重定向来解决LeetCode算法题?
    在LeetCode算法题中,我们经常需要在一个方法中进行多次计算并返回不同的结果。这时候,对象重定向(Object Redirection)就可以派上用场了。对象重定向是Java中一种常见的编程技巧,它可以将一个对象的输出重定向到另一个对...
    99+
    2023-08-15
    对象 重定向 leetcode
  • 重定向对象和同步对象在 Python 中的使用技巧有哪些?
    Python 是一门非常流行的编程语言,它具有简单易用、高效、灵活等特点,因此被广泛应用于各种领域。在 Python 中,重定向对象和同步对象是非常重要的概念,它们可以帮助我们更好地控制程序的运行。在本文中,我们将介绍重定向对象和同步对象在...
    99+
    2023-07-24
    重定向 对象 同步
  • Linux 中如何使用 Java 对象进行重定向操作?
    在Linux中,Java对象的重定向操作是非常常见的。重定向操作是将输出从一个文件描述符或一个命令重定向到另一个文件描述符或命令的过程。在Java中,我们可以使用System类的setOut方法来重定向输出流。 以下是如何在Linux中使用...
    99+
    2023-10-10
    重定向 linux 对象
  • 如何在 Laravel 中使用重定向来跟踪 Go 对象?
    Laravel 是一个流行的 PHP 框架,它提供了许多有用的功能来简化 Web 应用程序的开发。其中之一是重定向。重定向是将用户从一个 URL 重定向到另一个 URL 的过程。在本文中,我们将探讨如何在 Laravel 中使用重定向来跟踪...
    99+
    2023-08-08
    对象 重定向 laravel
  • python如何使用opencv提取光流详解
    目录前言提取帧提取flow光流环境配置结果总结前言 光流flow特征中包含了一个视频当中运动相关的信息,在视频动作定位当中光流特征使用的比较多,所以记录一下提取光流特征的方法。 使用...
    99+
    2024-04-02
  • Python中类和对象的绑定及非绑定方法详解
    目录一、绑定方法1 对象的绑定方法2 类的绑定方法二、非绑定方法三、练习1 绑定方法小结2 非绑定方法小结类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为...
    99+
    2023-03-03
    Python类 绑定方法 Pytho 对象绑定方法 Python类 对象绑定方法
  • 以SortedList为例详解Python的defaultdict对象使用自定义类型的方法
    目录写在前面第一种方法: 封装成函数第二种方法: 类封装写在前面 最近写周赛题, 逃不开的一种题型是设计数据结构, 也就是第三题, 做这种题需要的就是对语言中的容器以及常用排序查找算...
    99+
    2024-04-02
  • 如何通过 Python 实现对象的同步和重定向?
    Python 是一门高级编程语言,被广泛应用于各种领域。在编写 Python 应用程序时,我们经常需要使用对象来处理数据。在这个过程中,对象的同步和重定向是非常重要的。本文将介绍如何通过 Python 实现对象的同步和重定向,以及如何使用相...
    99+
    2023-07-24
    重定向 对象 同步
  • 如何正确使用Python API中的重定向和存储功能?
    Python API中的重定向和存储功能是非常重要的特性,可以帮助我们更加方便地获取和处理数据。在本文中,我们将介绍如何正确使用Python API中的重定向和存储功能,并通过演示代码来详细说明。 一、什么是重定向? 重定向是一种将网页请求...
    99+
    2023-09-13
    api 重定向 存储
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作