OpenCV基础(二)

简介: OpenCV教程概览:介绍如何在图像中绘制几何图形,如使用`cv.line`绘制直线,`cv.circle`画圆,`cv.rectangle`画矩形,并添加文字。还涵盖了图像的几何变换,包括缩放、平移、旋转和仿射变换。代码示例展示了这些操作在Python中的实现,通过`cv2.resize`进行图像缩放,`cv.getRotationMatrix2D`及`cv.warpAffine`实现旋转,以及`cv.getPerspectiveTransform`进行透射变换。

OpenCV基础(一)+https://developer.aliyun.com/article/1544252?spm=a2c6h.13148508.setting.22.1fa24f0eHs4uWw



绘制几何图形


绘制直线


cv.line(img,start,end,color,thickness)


  • img:要绘制直线的图像
  • Start,end: 直线的起点和终点
  • color: 线条的颜色
  • Thickness: 线条宽度


绘制圆形


cv.circle(img,centerpoint, r, color, thickness)


  • img:要绘制圆形的图像
  • Centerpoint, r: 圆心和半径
  • color: 线条的颜色
  • Thickness: 线条宽度,为-1时生成闭合图案并填充颜色


绘制矩形


cv.rectangle(img,leftupper,rightdown,color,thickness)


  • img:要绘制的矩形图像
  • Leftupper, rightdown: 矩形的左上角和右下角坐标
  • color: 线条的颜色
  • Thickness: 线条宽度


向图像中添加文字


cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)


实战:


import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
 
img = np.zeros((512,512,3), np.uint8)
 
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv.circle(img,(447,63), 63, (0,0,255), -1)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
 
plt.imshow(img[:,:,::-1])
plt.title('匹配'), plt.xticks([]), plt.yticks([])
plt.show()


几何变换


图像缩放


cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)


  • src : 输入图像
  • dsize: 绝对尺寸,直接指定调整后图像的大小
  • fx,fy: 相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可
  • interpolation:插值方法


import cv2 as cv
#  读取图片
img1 = cv.imread("dog.jpeg")
 
rows,cols = img1.shape[:2]
res = cv.resize(img1,(2*cols,2*rows),interpolation=cv.INTER_CUBIC)
 
 
res1 = cv.resize(img1,None,fx=0.5,fy=0.5)
 
 
cv.imshow("orignal",img1)
cv.imshow("enlarge",res)
cv.imshow("shrink)",res1)
cv.waitKey(0)
 
 
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(res[:,:,::-1])
axes[0].set_title("尺度)")
axes[1].imshow(img1[:,:,::-1])
axes[1].set_title("原图")
axes[2].imshow(res1[:,:,::-1])
axes[2].set_title("尺度")
plt.show()


图像平移


cv.warpAffine(img,M,dsize)


  • img: 输入图像
  • M: 2∗∗3移动矩阵


图像旋转


cv2.getRotationMatrix2D(center, angle, scale)


  • center:旋转中心
  • angle:旋转角度
  • scale:缩放比例


import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
 
img = cv.imread("image.jpg")
 
#  图像旋转
rows,cols = img.shape[:2]
 
M = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
# 旋转变换
dst = cv.warpAffine(img,M,(cols,rows))
 
 
fig,axes=plt.subplots(nrows=1,ncols=2,dpi=100)
axes[0].imshow(img1[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("旋转后")
plt.show()



仿射变换


仿射变换是线性变换与平移的组合,可以保持直线和平行线的性质。它将矩形映射为平行四边形,即变换后各边仍然平行。


图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合。


import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
 
img = cv.imread("image.jpg")
 
rows,cols = img.shape[:2]
 
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[100,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
 
dst = cv.warpAffine(img,M,(cols,rows))
 
 
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("仿射后")
plt.show()


透射变换


import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
 
img = cv.imread("image.jpg")
 
rows,cols = img.shape[:2]
# 2.1 创建变换矩阵
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[100,145],[300,100],[80,290],[310,300]])
 
T = cv.getPerspectiveTransform(pts1,pts2)
 
dst = cv.warpPerspective(img,T,(cols,rows))
 
 
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("透射")
plt.show()


类似的还有OpenCV处理平滑方法、边缘检测、视频读写等操作和API,后期会更新更多OpenCV相关操作~

相关文章
|
6天前
|
算法 计算机视觉 C++
OpenCV基础(一)
OpenCV是一个开源的计算机视觉库,用于图像处理和机器学习,由Intel发起,支持多种平台和语言,如Python、C++。它提供丰富的优化算法,适用于面部识别、物体识别等应用。OpenCV-Python是其Python接口,便于快速原型设计,包含多个模块,并有丰富的学习资源。基本操作包括使用`cv.imread()`读取图像,`cv.imshow()`显示图像,以及`cv.imwrite()`保存图像。
|
6天前
|
机器学习/深度学习 编译器 算法框架/工具
OpenCV算法库
numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。
|
1月前
|
机器学习/深度学习 并行计算 算法
OpenCV 4基础篇| OpenCV简介
OpenCV 4基础篇| OpenCV简介
|
1月前
|
存储 计算机视觉 Python
OpenCV 4基础篇| OpenCV图像基本操作
OpenCV 4基础篇| OpenCV图像基本操作
|
1月前
|
计算机视觉
OpenCV之imutils实战
【1月更文挑战第3天】
|
存储 C++ 计算机视觉
OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)
OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)
441 0
|
算法 计算机视觉 Python
CV8 OpenCV环境下实现大津算法
大津算法最终的目的,就是求一个标准的全局阈值区分前景和背景(小于该阈值的为前景。大于该阈值的为背景),使得前景和背景像素的灰度值方差之和最大。因为方差越大,相关性越小,黑白越分明。
141 0
|
机器学习/深度学习 自然语言处理 Serverless
OpenCV简介与安装
OpenCV简介与安装
234 0