数据要素产业
OpenCV指南1:如何在图像中添加形状和文字?
大家好,在接下来的博客中,我会尽力帮助你开始你的 Open CV 课程。这是该系列的第一篇博客,在这篇博客中,我主要关注 OpenCV 的基础,因此我们将在本博客中回答下面提到的问题。
如何安装 OpenCV?
如何加载和显示图像?
我们能用和图像一样的方式读取和显示视频吗?
如何调整图像大小?
如何在图像中添加形状和文字?
如何裁剪图像?
如何旋转或移动图像?
介绍OpenCV 是开源计算机视觉库的代表。它是用于解决计算机视觉问题的 Python 库。通过使用 OpenCV,我们可以轻松添加不同的图像,或裁剪图像,或检测图像中的边缘,或将其用于人脸检测等。OpenCV 的编程历史根据维基百科OpenCV 是用C++编写的,它的主要接口是用 C++编写的,但它仍然保留了一个不太全面的旧 C 接口。所有新的开发和算法都出现在 C++ 界面中。在Python、Java和MATLAB / OCTAVE 中有绑定。QnA系列查看下面提到的问答系列题目,它将涵盖你的所有疑问。现在,让我们开始吧。
1) 如何安装 OpenCV?
在这个模块中,我们需要 Numpy 和 Matplotlib 以备将来使用。所以,我们可以通过在命令提示符下执行下面提到的命令来安装这些(这里我假设你的系统中已经安装了 python 3.0):pip install numpypip install matplotlibpip install opencv-contrib-python
2) 如何加载和显示图像?
首先,我们必须导入一些重要的库,如下所示:import numpy as np
import pandas as pd
import cv2 as cv ### import opencv
from google.colab.patches import cv2_imshow ### for image display
from skimage import io
from PIL import Image
import matplotlib.pylab as plt
现在我们将尝试使用im.read读取图像,并使用cv2_imshow显示图像(如果有任何问题,你也可以使用 cv.imshow,因为我使用的是谷歌协作,所以更喜欢使用 cv2_imshow)。img=cv.imread("/content/drive/MyDrive/Colab Notebooks/19mxv41g9rh61(1).jpg")
print("Shape of the image:",img.shape,"")
cv2_imshow(img)
上述代码的输出是:
3)我们能用和图像一样的方式读取和显示视频吗?
是的,我们可以,但是图像和视频之间有什么区别?实际上,最简单的答案是,图像是单个图像,而视频是一系列以指定帧速率顺序播放的图像,通常来自播放视频文件(数字)的软件或播放磁带的硬件(模拟)。换句话说,视频具有运动性。当我们尝试读取和显示视频时,我们将在 OpenCV 中观察到我们获得图像序列的相同操作,我们可以对图像执行相同的操作。让我们看看它会如何发生。Vid=cv.VideoCapture("/content/drive/MyDrive/Colab Notebooks/Pexels Videos 2716.mp4")
while True:
isTrue,frame= Vid.read()
cv2_imshow(frame)
if cv.waitKey(20) & 0xFF==ord('d'):
break
Vid.release()
cv.destroyAllWindows()
上述代码的输出是:视频的第1帧
视频的第 2 帧
我已经展示了视频的前 2 帧。但是在输出中,你将获得视频中所有可能的帧。此外,如果我们必须捕获实时视频,那么我们可以使用 cv.VideoCapture(0)。如果我们有 2 个摄像头与系统连接,那么我们可以使用 cv.VideoCapture(1) 并且我们可以进一步增加摄像头数量。
4) 如何调整图像大小?
4.1. 缩小图像有时我们会得到高分辨率的图像,因此对此类图像执行任何操作都非常困难,因为它会占用更多空间并影响性能。在这种情况下,我们将调整图像的大小和缩放比例以避免此类问题。cv.resize() 首选的插值方法是 cv.INTER_AREA ,用于缩小原始图像。下面提到的是我们可以用来调整图像、视频和实时视频大小的功能。def frameResize(frame,scale):
Height=int(frame.shape[0]*scale)
Width=int(frame.shape[1]*scale)
Dimension=(Height,Width)
return cv.resize(frame,Dimension,interpolation = cv.INTER_AREA)
现在,我们将尝试将图像大小调整 50%。img=cv.imread("/content/drive/MyDrive/Colab Notebooks/Opencv/fiona-smallwood-iUxjs-F0voI-unsplash-min.jpg")
print("Shape of the image before resizing :",img.shape,"")
cv2_imshow(img)
print(" Image post Resizing ")
img_resize=frameResize(img,0.50)
cv2_imshow(img_resize)
上述代码的输出是:原图:
调整大小后:
4.2. 放大图像:上面我们已经看到了图像的缩小。现在我们将专注于图像的放大。我们将使用 cv.INTER_CUBIC & cv.INTER_LINEAR 进行放大。cv.INTER_CUBIC 比 cv.INTER_LINEAR 慢,但cv.INTER_CUBIC 的输出比 cv.INTER_LINEAR 好。默认情况下,插值方法 cv.INTER_LINEAR 用于所有调整大小的目的。Resized=cv.resize(original_img,(700,850),interpolation=cv.INTER_LINEAR)
cv2_imshow(Resized)
上述代码的输出是:
4.3. 视频大小调整现在我们将查看视频的大小调整。Vid=cv.VideoCapture("/content/drive/MyDrive/Colab Notebooks/Pexels Videos 2716.mp4")
while True:
isTrue,frame= Vid.read()
New_frame=frameResize(frame,0.50)
cv2_imshow(New_frame)
if cv.waitKey(20) & 0xFF==ord('d'):
break
Vid.release()
cv.destroyAllWindows()
上述代码的输出是:
下面提到的是另一个功能,在实时视频的情况下很有帮助。def ChangeRes(Width,Height):
Vid.set(3,Width)
Vid.set(4,Height)
return Vid
5) 如何在图片中添加形状和文字?
在这里,我们将尝试添加不同的形状,如矩形、圆形,并尝试形状的厚度。
5.1. 在图像中添加矩形下面提到的是这里的代码,我们将 original_img 作为我们将在其上绘制矩形的输入图像。矩形的起始像素点是(200,200),一直到(300,300)。而颜色是 B=200,G=100 和 R=150。查看下面提到的代码及其输出original_img=cv.imread("/content/drive/MyDrive/Colab Notebooks/Opencv/19mxv41g9rh61(1).jpg")
cv.rectangle(original_img,(200,200),(300,300),(200,100,150),thickness=2)
cv2_imshow(original_img)
上述代码的输出:
5.2. 添加具有颜色填充的矩形下面提到的是这里的代码,我们将 original_img 作为我们将在其上绘制矩形的输入图像。矩形的起始像素点是(0,0),它一直到图像的中心。而颜色是 B=200,G=155 和 R=40。这里我们采用了thickness=-1,所以整个矩形都被颜色填充。cv.rectangle(original_img,(0,0),(original_img.shape[1]//2,original_img.shape[0]//2),(200,155,40),thickness=-1)
cv2_imshow(original_img)
上述代码的输出:
5.3. 添加具有颜色填充的圆形下面提到的是这里的代码,我们将 original_img 作为我们将在其上绘制圆圈的输入图像。圆的中心像素点为(450,450),圆的半径为40。而颜色为B=25,G=0,R=100。这里我们采用了thickness=-1,所以整个圆圈都被颜色填充。cv.circle(original_img,(450,450),40,(25,0,100),thickness=-1)
cv2_imshow(original_img)
上述代码的输出:
5.4. 在图像中添加线下面提到的是这里的代码,我们将 original_img 作为我们将在其上绘制矩形的输入图像。线的起始像素点为 (300,300),线的终点像素为 (500,500)。cv.line(original_img,(300,300),(500,500),255,thickness=2)
cv2_imshow(original_img)
上述代码的输出:
5.5. 在图像中添加文本在这里,我们将通过使用cv.putText()方法为空白图像添加文字,在这里我们输入文字,像素位置,我们还可以选择字体类型,如字体FONT_HERSHEY_SIMPLEX,FONT_HERSHEY_PLAIN等等,字体比例、颜色、粗细。我们也可以使用下面的代码中提到的 numpy 创建空白图像。blank=np.ones((500,500,3),dtype='uint8')
cv.putText(blank,'Green light',(blank.shape[0]//2,blank.shape[1]//2),cv.FONT_HERSHEY_COMPLEX,1,(0,255,0),thickness=3)
cv2_imshow(blank)
上述代码的输出:
6) 如何裁剪图像?
我们可以使用下面提到的代码轻松裁剪图像的特定部分。这里你只需要指定你要裁剪的像素。cv2_imshow(original_img)
Crop_img=original_img[200:350,325:450]
cv2_imshow(Crop_img)
上述代码的输出:原图:
从图像中裁剪部分:
7) 如何旋转或移动图像?
如果我们想移动图像,请查看下面的函数,这对于相同的功能非常有用:def rotate(img,angle,center=None):
w,h=img.shape[:2]
if center==None:
center=(w//2,h//2)
#center is the center of image from which we have to rotate if it is None then it is cconsider as the center of the original image.
rotMat=cv.getRotationMatrix2D(center,angle,1.0)
dim=(w,h)
return cv.warpAffine(img,rotMat,dim)
在这里,我们尝试使用上述函数来旋转图像。Rotated_img=rotate(original_img,45,(60,60))
cv2_imshow(Rotated_img)
上述代码的输出:
现在,我们将尝试旋转上面已经旋转的图像。
从上面的输出我们知道,如果我们尝试旋转已经旋转的图像,那么在早期图像中不可见的图像部分也会在当前输出图像中丢失。此外,我们可以颠倒图像。查看下面提到的代码及其输出。flip_img=cv.flip(original_img,-1)
cv2_imshow(flip_img)
上述代码的输出:
总结
如果你到目前为止已经阅读了该博客,那么你必须熟悉 OpenCV。OpenCV 的其余主题将在下一篇博客中介绍。查看下一篇博客的链接,我们将重点介绍 OpenCV 的一些高级内容。