本文章对应OpenCV免费公开课第四节 Image Annotation。课程链节OpenCV官网 配合官网视频教程效果更好。
记得关注专栏啊!最近跟新会很频繁的!
在本节课中我们将讲述如何使用OpenCV给图片添加注释。我们将学习如何添加以下的注释:
- 划线
- 画圆圈
- 画正方形
- 添加文字
这些操作将在你想要注释你程序的结果时变得有用。注释在调试的时候也会很有用。
准备
下载素材
通过一下命令 理论上可以下载到所需的所有素材。
def download_and_unzip(url, save_path):
print(f"Downloading and extracting assests....", end="")
# Downloading zip file using urllib package.
urlretrieve(url, save_path)
try:
# Extracting zip file using the zipfile package.
with ZipFile(save_path) as z:
# Extract ZIP file contents in the same directory.
z.extractall(os.path.split(save_path)[0])
print("Done")
except Exception as e:
print("\nInvalid file.", e)
URL = r"https://www.dropbox.com/s/rys6f1vprily2bg/opencv_bootcamp_assets_NB3.zip?dl=1"
asset_zip_path = os.path.join(os.getcwd(), "opencv_bootcamp_assets_NB3.zip")
# Download if assest ZIP does not exists.
if not os.path.exists(asset_zip_path):
download_and_unzip(URL, asset_zip_path)
下载不了的这里有百度网盘链接:
https://pan.baidu.com/s/1s3yGt01bBz-EFOL0bH7UNA?pwd=feyq 提取码: feyq
导入库
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from zipfile import ZipFile
from urllib.request import urlretrieve
from IPython.display import Image //让图像可以直接在jupyter中显示
%matplotlib inline //让图像可以直接在jupyter中显示
在以下的课程中我们将使用一下图片作为样例。
# 读取图片
image = cv2.imread("Apollo_11_Launch.jpg", cv2.IMREAD_COLOR)
# 展示原始图像
plt.imshow(image[:, :, ::-1])
注意此处图片看似黑白 实际上为彩色图片
画一条线
让我们从在图片中华一条线开始,我们将使用 cv2.line
函数来绘制。
函数参数
img = cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
img
: 已经被注释过的图片
这个函数有 四个必选参数
img
: 将要画线的图片pt1
:线的第一个点(x,y坐标)pt2
:线的第二个点color
:将要画的先的颜色
其他重要的可选参数包括:thickness
:线的粗细 整数 默认为1;lineType
:线的类型。默认值为8 表示使用8联通方式绘制。通常, cv2.LIME_AA (平滑线条) 一般被用来绘制线条。
OpenCV Documentation
line
: Documentation link
让我们看一个例子
imageLine = image.copy()
# 线从 (200,100) 到 (400,100)
# 线的颜色是黄色( YELLOW ) (回忆 cv使用BGR颜色格式)
# 线的粗细为 5px
# 线的类型为 cv2.LINE_AA
cv2.line(imageLine, (200, 100), (400, 100), (0, 255, 255), thickness=5, lineType=cv2.LINE_AA);
# 展示图片
plt.imshow(imageLine[:,:,::-1])
绘制原型
让我们喀什学习如何在图片上画一个圆形。我们将使用到cv2.circle
函数来实现。
函数参数
img = cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
img
: 被注释过的输出图像
这个函数有4个必选参数:
img
: 将要被画线的图center
: 圆圈的中心radius
: 圆的半径color
: 圆的颜色
接下来让我们看看其他我们将经常用到的参数。
thickness
: 圆的外边框大小(如果为正数). 如果这个变量为负数,圆将被填满.lineType
: 边界的类型. 这个和cv2.line中的lineType参数相同
OpenCV Documentation
circle
: Documentation link
让我们看一个例子。
# 画一个圆形
imageCircle = image.copy()
cv2.circle(imageCircle, (900,500), 100, (0, 0, 255), thickness=2, lineType=cv2.LINE_AA);
# 展示图片
plt.imshow(imageCircle[:,:,::-1])
绘制一个正方形
我们将使用cv2.rectangle函数来在图片上绘制正方形。这个函数有以下参数。
函数参数
img = cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
img
: 被注释的输出图片
这个函数有 4个必选参数:
img
:将要被画线的图pt1
:矩形的顶点. 在此通常使用 左上顶点.pt2
: 矩形的顶点. 在此通常使用 右下顶点.color
: 矩形颜色
接下来让我们看看其他我们将经常用到的参数。
thickness
: 矩形的外边框大小(如果为正数). 如果这个变量为负数,矩形将被填满.lineType
: 边界的类型. 这个和cv2.line中的lineType参数相同
OpenCV Documentation Links
rectangle
: Documentation link
# 画一个矩形 (线宽是个正整数)
imageRectangle = image.copy()
cv2.rectangle(imageRectangle, (500, 100), (700, 600), (255, 0, 255), thickness=5, lineType=cv2.LINE_8)
# 显示图像
plt.imshow(imageRectangle[:, :, ::-1])
添加文字
最后让我们看看如何使用cv2.putText在图片上添加文字。
函数参数
img = cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
img
: 被注释的输出图片
这个函数有6个必选参数:
这个函数有 4个必选参数:
-
img
:将要被写上文字的图 -
text
: 要写的字符串 -
org
: 在图片中文字左下角的位置 -
fontFace
: 字体种类 -
fontScale
: 字体比例因子,乘以字体基本大小为显示大小。 -
color
: 文字颜色
接下来让我们看看其他我们将经常用到的参数。 -
thickness
:字体粗细. 默认为1. 不可为负数。 -
lineType
: 线的种类。默认为8联通。通常使用,cv2.LINE_AA。
OpenCV Documentation
putText
: Documentation link
让我们看一个例子。
imageText = image.copy()
text = "Apollo 11 Saturn V Launch, July 16, 1969"
fontScale = 2.3
fontFace = cv2.FONT_HERSHEY_PLAIN
fontColor = (0, 255, 0)
fontThickness = 2
cv2.putText(imageText, text, (200, 700), fontFace, fontScale, fontColor, fontThickness, cv2.LINE_AA);
# Display the image
plt.imshow(imageText[:, :, ::-1])
课后练习
原文为OpenCV免费公开课Free OpenCV Course - Official Certification by OpenCV
翻译 TallentJoe
未经允许,禁止转载
答案:DADDA