外接矩形、外接圆:

 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. Google Hacking语法总结

    Google Hacking语法总结 Google Hacking是利用谷歌搜索的强大,来在浩瀚的互联网中搜索到我们需要的信息.轻量级的搜索可以搜素出一些遗留后门,不想被发现的后台入口,中量级的搜索出 ...

  2. SQL - 5

    Smiling & Weeping ----我本不想和风讨论你,可风说可以替我去见你 第五章:SQL高级处理 5.1 窗口函数 5.1.1 窗口函数概念及基本的使用方法 窗口函数也称为OLAP ...

  3. window操作系统安装多个版本nodejs版本-控制工具nvm

    参考: https://blog.csdn.net/m0_38134431/article/details/118388297 https://juejin.cn/post/7044890876631 ...

  4. python开发实战——ip池

    前言代理IP池是一组可用的代理IP地址,用于访问网站或执行其他网络请求.它可以帮助我们在网络请求时隐藏我们的真实IP地址,从而提高网络安全性.匿名性和稳定性.同时,代理IP池还可以通过定时更新和测试代 ...

  5. python系列:argparse详解 外部传参给python的库

    一.argparse简介 argparse 模块是 Python 内置的用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口,能够帮助程序员为模型定义参数. ar ...

  6. 关于tiptop gp5.2采购模块,价格变更的随笔

    采购价格变更要看具体环节,你可以把他当作是三张表,采购价格表.收货价格表.入库价格表,这些还好处理,如果已抛砖到财务端生成账款再要求改价格就更复杂,会产生更多张表了,改起来也就更复杂. 用apmt91 ...

  7. gitbook在线记事本

    https://app.gitbook.com/ About this template: An Internal Wiki to lay out everything anyone needs to ...

  8. 小米手机抓取Log教程

    当小米手机遇到任何系统下的较为严重的故障时(即此时系统还是基本正常运行的,只是某些功能实现出了问题),例如软件自动退出,SD卡自动卸载,电话无法拨出等等.可以请用户协助抓取log即系统运行日志,来发送 ...

  9. 英方软件和dell emc对比理解

    英方软件和dell emc对比理解: 英方软件 功能 对比dell emc理解 i2Availability 1.英方实现业务高可用的时候,要求在异地运行与生产机环境一致的备机,备机数据实时与生产机同 ...

  10. C# WebBrowser document.execCommand()解析

            //         // Summary:         //     对文档执行指定的命令.         //         // Parameters:         ...