外接矩形、外接圆:

 1 import cv2
2 import numpy
3
4 img = cv2.imread('../img/img.png', -1)
5 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
6 contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
7
8 for c in contours:
9 # 寻找平行于 x轴、y轴 的外接矩形坐标 -> 左上角坐标、宽度、高度
10 rectangle = cv2.boundingRect(c)
11 x, y, w, h = rectangle
12 # 绘制外接矩形
13 cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
14
15 # 寻找包含前景图的 可旋转 最小外接矩形 -> 中心点坐标、宽度、高度
16 rect = cv2.minAreaRect(c)
17 # 寻找旋转矩形的四个顶点 -> 左上角、右上角、右下角和左下角的顶点坐标
18 box = cv2.boxPoints(rect)
19 # 取整
20 box = numpy.int0(box)
21 # 绘制外接矩形,对box打包成列表是因为drawContours希望接收为tuple or list
22 # 或者说是一个iterable
23 cv2.drawContours(img, [box], 0, (0, 0, 255), 3)
24
25 # 计算最小外接圆 -> 圆心坐标、半径
26 (x, y), radius = cv2.minEnclosingCircle(c)
27 # 取整
28 center = int(x), int(y)
29 radius = int(radius)
30 # 绘制圆形
31 img = cv2.circle(img, center, radius, (0, 255, 0), 2)
32
33
34 img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
35 img = cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
36 cv2.imshow('', img)
37 cv2.waitKey()
38 cv2.destroyAllWindows()

1、cv2.boundingRect() Method 和 cv2.minAreaRect() Merhod:前者只寻找和 x、y轴 平行的矩形,后者则可以出现旋转角度。

2、cv2.drawContours() Method:第二个参数接收的是轮廓信息,但是这个轮廓信息需要以 tuple or list or set类型(或者说是iterable)才可以传入。

  请注意:当我们对 box 变量进行 tuple() list() set() 操作时,都会报错,这是因为,在针对numpy数组进行可迭代转换时,前面的三种方式,都会对numpy数组中的每个元素都视为单独的一个 ”列表元素“ ,而不是将整个 box 视为一个列表 这会导致如:

  box = [[ -8 410] [ 57 -21] [444 37] [379 469]],

  在使用 list() 后:

  box = [array([ -8, 410], dtype=int64), array([ 57, -21], dtype=int64), array([444,  37], dtype=int64), array([379, 469], dtype=int64)]

  但是我们需要的正确的格式是:

  [array([[ -8, 410], [ 57, -21], [444, 37], [379, 469]], dtype=int64)]

总结:针对numpy数组转换为可迭代对象时,[ ]、(, )、{ } 和 list()、tuple()、set() 会得到不用的结果,即是否会将元素视为单独的一个”列表元素“,这种情况只针对 numpy 数组(就笔者目前所接触过的各种类型)。

【Python】【OpenCV】绘制外接矩形、外接圆的更多相关文章

  1. opencv轮廓外接矩形

    1.寻找轮廓 api void cv::findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray ...

  2. Opencv 最小外接矩形合并拼接

    前一篇画出了最小外接矩形,但是有时候画出来的矩形由于中间像素干扰或者是其他原因矩形框并不是真正想要的 如图1是一个信号的雨图,被矩形框分割成了多个小框: 需要合并矩形框达到的效果: 主要思想: 扫描两 ...

  3. OpenCV 求外接矩形以及旋转角度

    程序没有写完整,大概功能就是实现了,希望大家分享学习,把他改对 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : ...

  4. opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形

    一.简介 二.轮廓最小外接矩形的绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //轮廓最小外 ...

  5. Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...

  6. opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

    一.简介 二.外接矩形的查找绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //外接矩形的查找 ...

  7. OpenCV代码:画出轮廓的外接矩形,和中心点

    #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include & ...

  8. Opencv 改进的外接矩形合并拼接方法

    上一篇中的方法存在的问题是矩形框不够精确,而且效果不能达到要求 这里使用凸包检测的方法,并将原来膨胀系数由20缩小到5,达到了更好的效果 效果图: 效果图: 代码: #include <open ...

  9. Opencv 图片边缘检测和最小外接矩形

    #include "core/core.hpp" #include "highgui/highgui.hpp" #include "imgproc/i ...

  10. 【python+opencv】轮廓发现

    python+opencv---轮廓发现 轮廓发现---是基于图像边缘提取的基础寻找对象轮廓的方法, 所有边缘提取的阈值选定会影响最终轮廓发现的结果. 介绍两种API使用: -cv.findConto ...

随机推荐

  1. 保护个人数据安全,使用luks加密硬盘分区

    create:2023-01-24 17:44:44 准备工作 新硬盘4T,无数据.在root用户或sudo状态下执行. 首先创建分区表,由于mbr最大支持只有2T,因此分区表创建为gpt格式. 然后 ...

  2. 「codeforces - 868F」Yet Another Minimization Problem

    link. 值域分治优化决策单调性 DP 的 trick.朴素做法 trivial,不赘述. 考虑求取一个区间 \([l,r]\) 的 DP 值.先搞定在 \(m=\lfloor\frac{l+r}{ ...

  3. Redis持久化 (RDB和AOF) 梳理

    Redis有两种持久化方案: RDB持久化 AOF持久化 RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照.简单来说就 ...

  4. ORA-01008:并非所有变量都已绑定-解决办法

    近期批量处理数据,后台用JAVA编写,连接Oracle数据库,程序运行报ORA-01008问题.解决这个问题时遇见的坑较多,下面复盘现象.问题提出解决办法,希望能帮到遇见同类问题的你. 调试问题: 后 ...

  5. oracle clob字段信息读取,不限字符长度

    在项目中,经常需要在plsql中查询clob的内容,提供以下两种方法: 第一种,oracle常规函数,限制文本在4000以内 select dbms_lob.substr(sql_text) from ...

  6. Debian12安装.NET7 SDK

    Debian,作为最受欢迎的 Linux 发行版之一,于 2023 年 6 月 10 日正式发布了其最新版本 Debian 12,代号"Bookworm".Debian 12 带来 ...

  7. RocketMQ版控制台,在左侧

    打开IntelliJ IDEA,创建一个Java工程. 在pom.xml文件中添加以下依赖引入Java SDK的依赖库.   <dependency> <groupId>org ...

  8. Top 6 Refactoring Patterns to Help You Score 80% in Code Quality

    Top 6 Refactoring Patterns to Help You Score 80% in Code Quality Posted by Ajitesh Kumar / In Code R ...

  9. DevOps|研发效能解决的是企业效率问题

    研发效能并不能解决企业效益问题 它不是利润中心,不能给你带来直接收入(研发效能相关工具厂商做咨询.出方案.卖工具除外).想要解决企业效益问题,依赖于企业战略.业务/产品.组织.运营.创新等其他方面. ...

  10. 【纯干货】IOS手机使用Charles抓包

    一.Charles 下载地址 https://www.charlesproxy.com/ 二.Charles 激活 1.生成激活码 生成激活码:https://www.zzzmode.com/myto ...