Python Opencv轮廓常用操作代码实例解析

1.颜色空间转换

使用cv2.cvtColor(input_image ,flag),flag为转换类型

常用的转换类型有:

  • BGR和灰度图的转换使用 cv2.COLOR_BGR2GRAY
  • BGR和HSV的转换使用 cv2.COLOR_BGR2HSV

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

2.二值化

  • ret, dst = cv2.threshold(src, thresh, maxval, type)
  • src:表示的是图片源(灰度图)
  • thresh:表示的是阈值(起始值)
  • maxval:表示的是最大值
  • type:表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)

返回值

ret:指定的thresh

dst: 目标图像

ret, dst = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY)

3.查找并绘制轮廓

3.1 cv2.findContours(image, mode, method[, offset])

概述:

寻找一个二值图像的轮廓。注意黑色表示背景,白色表示物体,即在黑色背景里寻找白色物体的轮廓

参数:

  • image: 8位单通道图像。非零像素值视为1,所以图像视作二值图像
  • mode: 轮廓检索的方式
    • cv2.RETR_EXTERNAL: 只检索外部轮廓
    • cv2.RETR_LIST: 检测所有轮廓且不建立层次结构
    • cv2.RETR_CCOMP: 检测所有轮廓,建立两级层次结构。上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
    • cv2.RETR_TREE: 检测所有轮廓,建立完整的层次结构
  • method: 轮廓近似的方法
    • cv2.CHAIN_APPROX_NONE: 存储所有的轮廓点
    • cv2.CHAIN_APPROX_SIMPLE: 压缩水平,垂直和对角线段,只留下端点。 例如矩形轮廓可以用4个点编码
    • cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chini chain近似算法
  • offset:(可选参数)轮廓点的偏移量,格式为tuple,如(-10,10)表示轮廓点沿X负方向偏移10个像素点,沿Y正方向偏移10个像素点

返回值:

  • contours: 轮廓点。列表格式,每一个元素为一个3维数组(其形状为(n,1,2),其中n表示轮廓点个数,2表示像素点坐标),表示一个轮廓
  • hierarchy: 轮廓间的层次关系,为三维数组,形状为(1,n,4),其中n表示轮廓总个数,4指的是用4个数表示各轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,第二个数表示同级轮廓的上一个轮廓的编号,第三个数表示该轮廓下一级轮廓的编号,第四个数表示该轮廓的上一级轮廓的编号

补充: 若想得到轮廓点的集合的列表,可使用

cnt = np.squeeze(contours[0])

3.2 cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]])

参数:

  • image: 需要绘制轮廓的目标图像,注意会改变原图
  • contours: 轮廓点,上述函数cv2.findContours()的第一个返回值
  • contourIdx: 轮廓的索引,表示绘制第几个轮廓,-1表示绘制所有的轮廓
  • color: 绘制轮廓的颜色
  • thickness:(可选参数)轮廓线的宽度,-1表示填充
  • lineType:(可选参数)轮廓线型,包括cv2.LINE_4,cv2.LINE_8(默认),cv2.LINE_AA,分别表示4邻域线,8领域线,抗锯齿线(可以更好地显示曲线)
  • hierarchy:(可选参数)层级结构,上述函数cv2.findContours()的第二个返回值,配合maxLevel参数使用
  • maxLevel:(可选参数)等于0表示只绘制指定的轮廓,等于1表示绘制指定轮廓及其下一级子轮廓,等于2表示绘制指定轮廓及其所有子轮廓
  • offset:(可选参数)轮廓点的偏移量

import cv2
img = cv2.imread('D:/2.jpg',1)

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY)

contours,hierarchy = cv2.findContours(dst, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)

cv2.imshow('img',img)
cv2.waitKey(0)

4.点与轮廓位置关系

此功能可查找图像中的点与轮廓之间的最短距离。当点在轮廓外时返回负值,当点在内部时返回正值,如果点在轮廓上则返回零

dist = cv2.pointPolygonTest(cnt, (100, 100), True)

检查(100,100)与轮廓(cnt)的距离

在函数中,第二个参数需要tuple类型;第三个参数是measureDist。 如果为True,则查找距离. 如果为False,则查找该点是在内部还是外部或在轮廓上(它分别返回+1,-1,0)

如果不需要到距离,请确保第三个参数为False,因为这是一个耗时的过程。因此,将其设为False可提供2-3倍的加速

5.直线拟合fitline函数

output = cv2.fitLine(InputArray points, distType, param, reps, aeps)

参数:

  • InputArray Points: 待拟合的直线的集合,必须是矩阵形式(如numpy.array)
  • distType: 距离类型。fitline为距离最小化函数,拟合直线时,要使输入点到拟合直线的距离和最小化。这里的距离的类型有以下几种:
    • cv2.DIST_USER : User defined distance
    • cv2.DIST_L1: distance = |x1-x2| + |y1-y2|
    • cv2.DIST_L2: 欧式距离,此时与最小二乘法相同
    • cv2.DIST_C: distance = max(|x1-x2|,|y1-y2|)
    • cv2.DIST_L12: L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
    • cv2.DIST_FAIR
    • cv2.DIST_WELSCH
    • cv2.DIST_HUBER
  • param: 距离参数,跟所选的距离类型有关,值可以设置为0
  • reps,aeps: 第5/6个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2

返回值:

output:对于二维直线,输出output为4维,前两维代表拟合出的直线的方向,后两位代表直线上的一点。(即通常说的点斜式直线)

loc = np.array(loc)
output = cv2.fitLine(loc, cv2.DIST_L2, 0, 0.01, 0.01)
k = output[1] / output[0]
b = output[3] - k * output[2]#k[key]报错?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python openCV实现摄像头获取人脸图片

    本文实例为大家分享了python openCV实现摄像头获取人脸图片的具体代码,供大家参考,具体内容如下 在机器学习中,训练模型需要大量图片,通过openCV中的库可以快捷的调用摄像头,截取图片,可以快速的获取大量人脸图片 需要注意将CascadeClassifier方法中的地址改为自己包cv2包下面的文件 import cv2 def load_img(path,name,mun = 100,add_with = 0): # 获取人脸识别模型 # # #以下路径需要更改为自己环境下xml文件

  • python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码

    python opencv把一张图片嵌入(叠加)到另一张图片上 1.背景: 最近做了个烟火生成系统的界面设计,需要将烟雾图片嵌入到任意一张图片中,因此需要python opencv把一张图片嵌入(叠加)到另一张图片上的知识.(图中红框最终生成图片没有的,只是界面有这个功能) 2.代码 resized1[global_y0:height+global_y0, global_x0:weight+global_x0] = resized0 resized0是小图 resized1是大图,其他参数是左上

  • 详解python中GPU版本的opencv常用方法介绍

    引言 本篇是以python的视角介绍相关的函数还有自我使用中的一些问题,本想在这篇之前总结一下opencv编译的全过程,但遇到了太多坑,暂时不太想回看做过的笔记,所以这里主要总结python下GPU版本的opencv. 主要函数说明 threshold():二值化,但要指定设定阈值 blendLinear():两幅图片的线形混合 calcHist() createBoxFilter ():创建一个规范化的2D框过滤器 canny边缘检测 createGaussianFilter():创建一个Ga

  • python opencv pytesseract 验证码识别的实现

    一.环境配置 需要 pillow 和 pytesseract 这两个库,pip install 安装就好了. install pillow -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pip install pytesseract -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 安装好Tesseract-OCR.exe pytesse

  • Python Opencv图像处理基本操作代码详解

    1.图像读取 使用cv2.imread(filepath,flags)读入图像 filepath: 读入图像完整路径(绝对路径,相对路径) flags: 读入图像标志 cv2.IMREAD_COLOR:默认参数,读入一副彩色图,忽略alpha通道:可以通过1指定 cv2.IMREAD_GRAYSCALE:读入灰度图片 也通过0指定 cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道 import cv2 img1 = cv2.imread('C:/star.png',1)

  • Python 利用OpenCV给照片换底色的示例代码

    OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法.相比于PIL库来说OpenCV更加强大, 可以做更多更复杂的应用,比如人脸识别等. 1. 读入并显示图片 im

  • python进行OpenCV实战之画图(直线、矩形、圆形)

    前言 在上一节我们通过使用NumPy的数组分割成功的在我们的图像上画了一个绿色的方块,但是如果我们想画一个单一的线条或者圆圈该怎么办呢?NumPy没有提供相关的功能,但是OpenCV提供了相关的函数,在本节就将为大家介绍三个基本的OpenCV画图方法: cv2.line() #1 cv2.rectangle() #2 cv2.circle() #3 1 画直线和矩形 在开始我们用OpenCV画我们的杰作之前,我们需要定义一个画布 import numpy as np #1 import cv2

  • Python+Opencv身份证号码区域提取及识别实现

    前端时间智能信息处理实训,我选择的课题为身份证号码识别,对中华人民共和国公民身份证进行识别,提取并识别其中的身份证号码,将身份证号码识别为字符串的形式输出.现在实训结束了将代码发布出来供大家参考,识别的方式并不复杂,并加了一些注释,如果有什么问题可共同讨论.最后重要的事情说三遍:请勿直接抄袭,请勿直接抄袭,请勿直接抄袭!尤其是我的学弟学妹们,还是要自己做的,小心直接拿我的用被老师发现了挨批^_^. 实训环境:CentOS-7.5.1804 + Python-3.6.6 + Opencv-3.4.

  • python opencv实现简易画图板

    python-opencv实现简易画图板,供大家参考,具体内容如下 # -*- coding: utf-8 -*- """ Created on Sat May 19 17:34:54 2018 @author: xxx """ import cv2 as cv import numpy as np def nothing(x): pass # 当鼠标按下时变为 True drawing = False # 如果 mode 为 True 绘制矩形

  • Python Opencv轮廓常用操作代码实例解析

    1.颜色空间转换 使用cv2.cvtColor(input_image ,flag),flag为转换类型 常用的转换类型有: BGR和灰度图的转换使用 cv2.COLOR_BGR2GRAY BGR和HSV的转换使用 cv2.COLOR_BGR2HSV img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 2.二值化 ret, dst = cv2.threshold(src, thresh, maxval, type) src:表示的是图片源(灰度图)

  • Python数据结构dict常用操作代码实例

    dict是python中的常用数据结构,应该尽量掌握其使用方法 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 代码如下 """ 初始化一个dict的四种方式: 1. dict() -> 创建一个空的dict 2. dict(mapping) -> new dictionary initialized from a mapping ob

  • Python socket服务常用操作代码实例

    套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作. 1. 实现客户端发送字符,服务器返回大写的字符: 服务器: import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): # 通过类的继承,实现 def handle(self): # 重写父类的handle方法,所有的操作都在此方法中 while True: # 循环,不停的接收从客户端来的数

  • Python tkinter常用操作代码实例

    这篇文章主要介绍了Python tkinter常用操作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.创建单选框 form tkinter import * #创建窗口体 window = tk() #初始化组合件绑定 w1 = IntVar() #设置初始选择项1 w1.set(1) def Occupation(): lable = Label(text="请选择职业").place(x=20,y=15) m=1 fo

  • Python list运算操作代码实例解析

    这篇文章主要介绍了Python list运算操作代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在操作list的时候,经常用到对列表的操作运算,比如说,列表添加,删除操作,其实,这里面经常回遇到这样一个问题,就是列表的操作容易被混淆了. 有人做了一个总结,这个很清晰,我就不多做阐述了: 1.append() 向列表尾部追加一个新元素,列表只占一个索引位,在原有列表上增加 2.extend() 向列表尾部追加一个列表,将列表中的每个元

  • PHP连接MySQL数据库操作代码实例解析

    方法一:普通方法(面向过程) 首先,先做出如下假设(也适用与方法二和方法三) $username=your_name; $userpass=your_pass; $dbhost=localhost; $dbdatabase=your_database; 下面是关键步骤: //生成一个连接 $db_connect=mysql_connect($dbhost,$username,$userpass) or die("Unable to connect to the MySQL!"); //

  • Python os库常用操作代码汇总

    Python自动的os库是和操作系统交互的库,常用的操作包括文件/目录操作,路径操作,环境变量操作和执行系统命令等. 文件/目录操作 获取当前目录(pwd): os.getcwd() 切换目录(cd): os.chdir('/usr/local/') 列出目录所有文件(ls):os.listdir('/usr/local/') 创建目录(mkdir):os.makedirs('/usr/local/tmp') 删除目录(rmdir):os.removedirs('/usr/local/tmp')

  • Python xlrd excel文件操作代码实例

    打开文件 import xlrd data = xlrd.open_workbook('路径') 获取文件中所有工作表的名称. data.sheet_names() 相当于进入文件中的一个工作表. table = data.sheet_by_name('Sheet1') 查看工作表一共有几行 rowNum = table.nrows 查看工作表一共有几列 colNum = table.ncols 查看第一行所有的名称. farst = table.row_values(0) 查看第一列所有的名称

  • Python %r和%s区别代码实例解析

    %r用rper()方法处理对象 %s用str()方法处理对象 相同结果 有些情况下,两者处理的结果是一样的,比如说处理int型对象. 例: print('I am %s years old.' % 22) print('I am %r years old.' % 22) 返回结果: I am 22 years old. I am 22 years old. 不同结果 例: x = "There are %d types of people." % 10 print('I said: %

  • Python ckeditor富文本编辑器代码实例解析

    1.安装第三方模块包 pip install django-ckeditor 2.添加应用 INSTALLED_APPS = [ ... 'ckeditor', # 富文本编辑器 'ckeditor_uploader', # 富文本编辑器上传图片模块 ... ] 3. 添加CKEditor设置 # 富文本编辑器ckeditor配置 CKEDITOR_CONFIGS = { 'default': { 'toolbar': 'full', # 工具条功能 'height': 300, # 编辑器高度

随机推荐