提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
OpenCV入门课程
- OpenCV:轻量、高效、开源。最广泛使用的计算机视觉工具。
- 课程内容:
- 图片的读取、RGB彩色通道、区域裁剪、绘制图像和文字;
- 均值滤波、特征提取、模板匹配、梯度算法;
- 阈值算法、形态学操作、摄像头的读取。
- 背景知识:
- Python基本语法
提示:以下是本篇文章正文内容,下面案例可供参考
一、下载安装OpenCV工具包
win+R打开cmd面板
pip install -i https://pupi.tuna.tsinghua.edu.cn/simple opencv-python
二、利用Pycharm
1.test00_hello.py
图片的读取
代码如下:
import cv2#导入OpenCV库
print(cv2.getVersionString())#打印OpenCV库的版本号
image = cv2.imread("opencv_logo.jpg ")#OpenCV读取图片文件,存放在image变量中(为一个numpy数据类型)
print(image.shape)#打印image的维度(图片像素的横行,图片像素的纵列,图片三原色彩色通道)
cv2.imshow("image",image)#("窗口名",变量名)
cv2.waitKey()#窗口暂停函数
运行结果:
2.test02_color.py
RGB彩色通道
代码如下:
import cv2
image = cv2.imread("opencv_logo.jpg")
cv.imshow("blue",image[:,:,0])
cv.imshow("green",image[:,:,1])
cv.imshow("red",image[:,:,2])
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#彩色图像灰度变换算法,可以把三个彩色通道的图像做平方和加权平均
cv2.imshow("gray",gray)#为BGR三原色的平均
cv.waitKey()
运行结果:
3.test03_crop.py
区域裁剪
代码如下:
import cv2
image = cv2.imread("opencv_logo.jpg")
crop = image[10:170,40:200]#[横行,纵列]
cv2.imshow("crop",crop)
cv2.waitKey()
运行结果:
4. test04_draw.py
绘制图像和文字
代码如下:
import cv2
import numpy as np
image = np.zeros([300,300,3],dtype=np.uint8)#用numpy创建黑色画布
cv2.line(image,(100,200),(250,250),(255,0,0),2)#(image,起点坐标,终点坐标,线段颜色,线段粗细(2个像素))
cv2.rectangle(image,(30,100),(60,150),(0,255,0),2)
cv2.circle(image,(150,100),20,(0,0,255),3)#(image,圆心坐标,半径,颜色,粗细)
cv2.putText(image,"hello",(100,150),0,1,(255,255,255),2,1)
cv2.imshow("image",image)
cv2.waitKey()
运行结果:
5.test05_blur.py
均值滤波
代码如下:
import cv2
image = cv2.imread("plane.jpg")
gauss = cv2.GaussianBlur(image,(5,5),0)#高斯滤波器
median = cv2.medianBlur(image,5)#中值滤波器
cv2.imshow("image",image)
cv2.imshow("image",gauss)
cv2.imshow("image",median)
cv2.waitKey()
运行结果:
6.test06_corner.py
特征提取
代码如下:
import cv2
image = cv2.imread("opencv_loge.jpg")
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,500,0.1,10)#利用函数获取图像中的特征点(500——最多返回500个特征点,0.1——质量优于0.1,10——特征点之间的距离大于10)
for corner in corners:#将特征点标记出来
x,y = corner.ravel()
cv2.circle(image,(int(x),int(y)),3,(255,0,255),-1)
cv2.imshow("corners",image)
cv2.waitKey()
运行结果:
7.test07_match.py
模板匹配
代码如下:
import cv2
import numpy as np
image = cv2.imread("poker.jpg")
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
template = gray[75:105,235:265]#选取图像区域作为匹配模板,使用索引gray[横行,纵列],刚好包含一个菱形
match = cv2.matchTemplate(gray,template,cv2.TM_CCOEFF_NORMED)#利用函数存入待检测图像gray和模板template,使用标准匹配相关算法
locations = np.where(match >= 0.9)#找出匹配系数大于0.9的匹配点
w,h = template.shape[0:2]#求出模板图案的长和宽
for p in zip(*locations[::-1]):#循环遍历每一个匹配点,在原始图像上画出对应的矩形框
x1,y1 = p[0],p[1]
x2,y2 = x1 + w,y1 + h
cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow("image",image)
cv2.waitKey()
运行结果:
8.test08_gradient.py
梯度算法
import cv2
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(gray, cv2.CV_64F)#拉普拉斯算子,大致对应了图像的二阶导数
canny = cv2.Canny(gray, 100, 200)#canny边缘监测,使用梯度区间定义边缘
cv2.imshow("gray", gray)
cv2.imshow("laplacian", laplacian)
cv2.imshow("canny", canny)
cv2.waitKey()
运行结果:
9.test09_threshold.py
阈值算法
代码如下:
import cv2
gray = cv2.imread("bookpage.jpg", cv2.IMREAD_GRAYSCALE)
ret, binary = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)#定义固定阈值
binary_adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 115, 1)#自适应阈值算法
ret1, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)#常用的阈值算法,自动计算恰当的阈值
cv2.imshow("gray", gray)
cv2.imshow("binary", binary)
cv2.imshow("adaptive", binary_adaptive)
cv2.imshow("otsu", binary_otsu)
cv2.waitKey()
运行结果:
10.test10_morphology.py
形态学操作
代码如下:
import cv2
import numpy as np
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)#做阈值处理,使用反向阈值
kernel = np.ones((5, 5), np.uint8)#5*5像素的正方形
erosion = cv2.erode(binary, kernel)#腐蚀binary图像
dilation = cv2.dilate(binary, kernel)#膨胀binary图像
cv2.imshow("binary", binary)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.waitKey()
腐蚀和膨胀对于清理图像边缘细节很有帮助,如果交替是使用腐蚀和膨胀可以获得更多的形态变化,比如封闭或打开图案中的空腔
运行结果:
11.test11_camera.py
摄像头的读取
代码如下:
import cv2
capture = cv2.VideoCapture(0)#读取设备摄像头
while True:
ret, frame = capture.read()#读取摄像头画面
cv2.imshow("camera", frame)
key = cv2.waitKey(1)
if key != -1:
break
capture.release()#释放指针
运行结果:
附件:图片