Opencv基本几何形状绘制

本文详细介绍如何使用OpenCV库在空白画布上绘制各种基本图形,包括直线、矩形、圆形、椭圆等,并提供了丰富的代码示例,展示了如何设置图形的位置、尺寸、颜色和线宽。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  全0矩阵
zeros(shape,dtype=None,order='C')

shape:矩阵大小        dtype:数据类型      order:数据排列顺序,默认按列排序

   直线
cv2.line(img,pt1,pt2,color,thickness=1,line_type=8 shift=0) 

主要参数 ——pt1:直线起点    pt2:直线终点    color:线颜色   thickness:线宽   

   矩形
cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)

主要参数——pt1:左上角起点  pt2:右下角终点  color:颜色  thickness:线宽

  圆形
cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)

主要参数——center:圆心  radius:半径  color:颜色  thickness:线宽

  椭圆
cv2.ellipse(img, center, axes, angle, start_angle, end_angle, color, thickness=1, line_type=8, shift=0)

主要参数——center:圆心   axes:(长轴长度,短轴长度)  angle:偏转角度 

                     start_angle:椭圆弧起始角度     end_angle:椭圆弧终止角度

示例:

矩阵:

import cv2
import numpy as np
import matplotlib.pyplot as plt

canvas = np.zeros((300,300,3),dtype="uint8")
#plt.imshow(canvas)
#plt.show()
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

直线:

import cv2
import numpy as np
import matplotlib.pyplot as plt

canvas = np.zeros((300,300,3),np.uint8)

##生成从(0,0)到(200,167)的线宽3的白色直线
cv2.line(canvas,(0,0),(200,167),255,3)  ##其实对应的np.zeros((300,300),np.uint8)
###生成颜色为(155,155,155)的彩色直线
cv2.line(canvas,(2,4),(100,300),(155,155,155),5)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

矩形:

import cv2
import numpy as np
import matplotlib.pyplot as plt

canvas = np.zeros((300,300,3),np.uint8)

##生成从(0,0)到(200,167)的线宽3的白色直线
cv2.rectangle(canvas,(20,20),(200,200),(55,255,155),5)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

圆形:

import cv2
import numpy as np
import matplotlib.pyplot as plt

canvas = np.zeros((300,300,3),np.uint8)

##生成从(0,0)到(200,167)的线宽3的白色直线
cv2.circle(canvas,(150,150),50,(55,255,155),5)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

椭圆:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = np.zeros((512,512,3),np.uint8)#生成一个空彩色图像
cv2.ellipse(img,(256,256),(150,100),0,0,180,250,-1)
#注意最后一个参数-1,表示对图像进行填充,默认是不填充的,如果去掉,只有椭圆轮廓了
plt.imshow(img,'brg')
plt.show()

任意位置任意半径圆:

import cv2
import numpy as np
from matplotlib import pyplot as plt

canvas = np.zeros((400,400,3),np.uint8)
for i in range(0,25):
    radius = np.random.randint(5,high = 200)#生成1个[5,200)的随机数
    color = np.random.randint(0,high = 256,size = (3,)).tolist()#生成3个[0,256)的随机数
    pt = np.random.randint(0,high = 300,size = (2,))#生成2个[0,300)的随机数
    cv2.circle(canvas,tuple(pt),radius,color,-1)#画圆

plt.imshow(canvas,'brg')
plt.show()

 

<think>好的,我现在要回答用户关于使用OpenCV在图像轮廓或形状绘制线条的问题。首先,我需要回顾一下用户提供的引用内容,看看有没有相关的代码示例或方法。 用户提供了四个引用,其中引用[2]、[3]、[4]都涉及OpenCV绘制轮廓的内容。特别是引用[3]和[4]给出了具体的代码示例,包括读取图像、灰度转换、二值化、查找轮廓和绘制轮廓的步骤。用户的问题是如何在形状或轮廓上绘制线条,这可能不仅仅是绘制轮廓,还包括在轮廓内部或特定位置线。 首先,我需要明确用户的需求。绘制轮廓通常使用cv2.drawContours函数,这已经在示例代码中出现过。但用户提到“绘制线条”,可能需要更多的操作,比如在检测到的形状上添加直线、箭头或其他几何图形,或者沿着轮廓的某些点线。 接下来,我需要整理步骤。通常,处理图像形状的步骤包括:读取图像、预处理(转灰度、二值化)、查找轮廓,然后进行绘制。用户可能需要的是在找到轮廓后,在图像上绘制线条,比如连接轮廓的关键点,或者在轮廓周围辅助线。 根据引用[3]和[4],绘制轮廓的代码已经存在,例如cv2.drawContours(image, contours, -1, (0,255,0), 3)。但用户可能需要更具体的线条绘制方法,比如使用cv2.line函数在特定坐标之间线。因此,我应该结合轮廓检测的结果,提取关键点或使用轮廓的坐标来绘制直线。 例如,在找到轮廓后,可以遍历轮廓中的点,或者在轮廓的凸包上线。或者,计算轮廓的中心点,并从中心点向边缘线。这需要结合OpenCV的其他函数,如cv2.convexHull、cv2.minEnclosingCircle等。 此外,用户可能需要了解如何在不同形状之间绘制连接线,或者标记特定区域。需要确保代码示例正确,包括参数的使用,比如颜色、线宽等。 还需要注意,用户在问题中提到的是Python示例,所以代码必须使用Python的OpenCV库,并且语法正确。例如,cv2.findContours在不同版本中的返回值可能不同,需要确认contours变量的正确获取方式。 最后,生成相关问题需要考虑用户可能遇到的后续问题,比如如何优化线条绘制、处理不同形状、性能问题等。这有助于用户进一步学习。</think>以下是如何使用OpenCV在图像轮廓或形状绘制线条的Python代码示例及分步说明: ### 一、基础轮廓线条绘制 ```python import cv2 # 读取图像并预处理 image = cv2.imread('shape.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 查找轮廓 contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 绘制所有轮廓(绿色线条,线宽2px) cv2.drawContours(image, contours, -1, (0,255,0), 2) # 显示结果 cv2.imshow('Contour Lines', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 此代码将检测到的所有外轮廓用绿色线条描边[^4]。 ### 二、特定形状标注 #### 1. 绘制外接矩形线框 ```python for cnt in contours: x,y,w,h = cv2.boundingRect(cnt) cv2.rectangle(image, (x,y), (x+w,y+h), (255,0,0), 2) # 蓝色矩形框 ``` #### 2. 绘制最小外接圆 ```python for cnt in contours: (cx,cy), radius = cv2.minEnclosingCircle(cnt) cv2.circle(image, (int(cx),int(cy)), int(radius), (0,0,255), 2) # 红色圆形 ``` ### 三、高级线条绘制 #### 1. 连接轮廓特征点 ```python for cnt in contours: # 计算凸包 hull = cv2.convexHull(cnt) # 绘制凸包连线 for i in range(len(hull)-1): cv2.line(image, tuple(hull[i][0]), tuple(hull[i+1][0]), (255,255,0), 2) ``` #### 2. 绘制中心轴线 ```python for cnt in contours: # 计算中心点 M = cv2.moments(cnt) cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) # 绘制十字线 cv2.line(image, (cx-20,cy), (cx+20,cy), (0,255,255), 1) cv2.line(image, (cx,cy-20), (cx,cy+20), (0,255,255), 1) ``` ### 关键参数说明: - `cv2.drawContours()`: - `-1` 表示绘制所有轮廓 - `(0,255,0)` 是BGR颜色值 - `2` 是线宽 - `cv2.line()`: - 需要指定起点和终点坐标 - 支持设置颜色、线宽和线型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值