当前位置: 首页 > news >正文

OpenCV 旋转矩形边界

边界矩形是用最小面积绘制的,所以它也考虑了旋转。使用的函数是**cv.minAreaRect**()。

import cv2
import numpy as npimg=cv2.imread(r'D:\PythonProject\thunder.jpg')
img1=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(img.dtype)
ret,thresh=cv2.threshold(img1,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[0]
M=cv2.moments(cnt)
area=cv2.contourArea(cnt)
perimeter=cv2.arcLength(cnt,True)
epsilon=0.5*cv2.arcLength(cnt,True)
approx=cv2.approxPolyDP(cnt,epsilon,True)
hull=cv2.convexHull(cnt)
k=cv2.isContourConvex(cnt)
#矩形
x,y,w,h=cv2.boundingRect(cnt)
print(x,y,w,h)
img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),3)
#旋转矩形
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
print(f'box:{box}')
box = np.int64(box)
cv2.drawContours(img,[box],0,(0,0,255),2)
#相切⚪
(x,y),radius=cv2.minEnclosingCircle(cnt)
center=(int(x),int(y))
radius=int(radius)
print(f'center:{center}')
img=cv2.circle(img,center,radius,(0,255,0))
#拟合椭圆
ellipse=cv2.fitEllipse(cnt)
im=cv2.ellipse(img,ellipse,(0,0,255),2)
#拟合直线
rows,cols=img.shape[:2]
[vx,vy,x,y]=cv2.fitLine(cnt,cv2.DIST_L2,0,0.01,0.01)
lefty=int(-x*vy/vx+y)
righty=int(((cols-x)*vy/vx)+y)
img=cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)
cv2.imshow('img',img)
cv2.waitKey(0)
print(M)

一个对象最上面,最下面,最左边,最右边的点

leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)
  • 【FFMPEG】Install FFmpeg CUDA gltransition in Ubuntu
  • linux颜色
  • hadoop的sbin
  • 2.第二阶段x86游戏实战2-认识进制、理解数据宽度和位的概念
  • 智能提醒助理系列-小程序静默登录
  • 纯CSS实现卡片欢动效果
  • vite 打包 学习
  • 自然语言处理-词向量转换
  • 数据结构:树与二叉树
  • Pygame中获取鼠标按键状态的方法
  • 【高级编程】实用类详解(补充)StringBuffer类 和 StringBuilder类
  • UE5 C++ 读取图片插件(一)
  • 【刷题笔记】删除并获取最大点数粉刷房子
  • 2024国赛数学建模A题思路模型代码
  • Android组件 - 收藏集 - 掘金
  • JavaScript 基础知识 - 入门篇(一)
  • 闭包,sync使用细节
  • 成为一名优秀的Developer的书单
  • 对超线程几个不同角度的解释
  • 分类模型——Logistics Regression
  • 工程优化暨babel升级小记
  • 计算机在识别图像时“看到”了什么?
  • 免费小说阅读小程序
  • 如何实现 font-size 的响应式
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 云大使推广中的常见热门问题
  • 带你开发类似Pokemon Go的AR游戏
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​力扣解法汇总946-验证栈序列
  • %@ page import=%的用法
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (六)软件测试分工
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)kafka实战——kafka源码编译启动
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)shell调试方法
  • (转)visual stdio 书签功能介绍
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .NET 8.0 中有哪些新的变化?
  • .NET分布式缓存Memcached从入门到实战
  • .NET下的多线程编程—1-线程机制概述
  • .net中我喜欢的两种验证码
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • ?php echo ?,?php echo Hello world!;?
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [2669]2-2 Time类的定义
  • [Android]创建TabBar
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]