OpenCV入门
OpenCV:轻量、高效、开源。最广泛使用的计算机视觉工具。
下面涉及图片的读取,RGB彩色通道,区域裁剪,绘制图形和文字,均值滤波,特征提取,模板匹配,梯度算法,阈值算法,形态学操作,摄像头读取。
- 第一个test01程序: 学习如何运行OpenCV的基本示例。
- 图像的彩色通道BGR: 了解OpenCV中图像颜色通道的表示方式。
- 图像的裁剪: 学习如何对图像进行裁剪操作。
- 绘制直线、矩形、圆形: 实践在图像上绘制基本图形。
- 均值滤波处理图像噪点: 使用均值滤波器去除图像噪声。
- 图像特征点的提取: 学习如何提取图像中的特征点。
- 模板匹配扑克牌上的菱形: 实现模板匹配技术。
- 图像的梯度算法与边缘检测: 探索图像梯度和边缘检测算法。
- 图像的二值化: 学习如何将图像转换为二值图像。
- 图像形态学之腐蚀和膨胀: 实践图像形态学操作。
- 调用电脑摄像头: 学习如何使用OpenCV捕获实时视频流。
1.第一个test01程序
import cv2
#查看cv2的版本
#print(cv2.__version__)
print(cv2.getVersionString())image = cv2.imread('opencv_logo.jpg')
#打印图片的维度(numpy)
print(image.shape)#显示图片
cv2.imshow('image', image)
cv2.waitKey(0)
结果:
2.图像的彩色通道BGR
图像的彩色通道,计算机对于图像色彩的描述,普遍使用了RGB3原色原理,也就是任何颜色都是由RGB,红绿蓝三种颜色按一定比例混合而成的。
对于open CV来说,存储一张彩色图片等同于存储三张灰度图,它们被存储在open CV图像数据的第三个维度上,灰度范围是零到255,OpenCV对颜色的存储顺序是BGR,与常见的RGB顺序刚好相反。当显示器需要渲染这张图片时,计算机会依次取出图像数据中的三张灰度图,再把它们分别投影到显示器的蓝色,绿色和红色的led芯片上。
import cv2
image = cv2.imread('opencv_logo.jpg')#BRG
cv2.imshow('blue', image[:,:,0])
cv2.imshow('green', image[:,:,1])
cv2.imshow('red', image[:,:,2])
#灰度图
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)cv2.waitKey(0)
结果:
3.图像的裁剪
import cv2image = cv2.imread('opencv_logo.jpg')
#裁剪图片
crop=image[10:170,40:200]
#打印裁剪的图片
cv2.imshow('crop',crop)
cv2.waitKey(0)
对于OpenCV索引的顺序是先横行后纵列,也就是说:索引10:170对应的是第10横行到第170,所以40:200对应的是第40,纵列到第200列。这个索引顺序与某些图像处理工具是不同的,比如加州理工大学基于MATLAB的图像处理工具包,就使用了相反的索引顺序。
结果:
4.绘制直线、矩形、圆形
OpenCV的图像数据实际上是numpy数组数据结构,所以可以直接使用number派创建一个黑色画布,具体代码如下:np.zeros维度300x300x3,灰度的数值类型是无符号八位整数nside integer eight,把创建的image变量显示出来,可以看到它是300×300的黑色画布。
import cv2
import numpy as np
image = np.zeros((300, 300, 3), np.uint8)#在画布上绘制直线
cv2.line(image, (100, 200), (250, 250), (250, 250, 0), 2)
#在画布上绘制矩形
cv2.rectangle(image, (30, 100), (60, 150), (0, 250, 0), 2)
#在画布上绘制圆形
cv2.circle(image, (150, 100), 20, (0, 0, 255), 3)
#在画布上绘制字符
cv2.putText(image,"hello",(100,50),0,1,(255,255,255),2)cv2.imshow("image",image)
cv2.waitKey(0)
结果:
5.均值滤波处理图像噪点
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('gauss',gauss)
cv2.imshow('median',median)
cv2.waitKey(0)
结果:
6.图像特征点的提取
import cv2
image = cv2.imread('opencv_logo.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#获取图像中的特征点,最多返回500个点,点的质量优于0.1,特征点之间的距离大于十个像素
corners = cv2.goodFeaturesToTrack(gray,500, 0.1, 10)
#把每一个点标记出来,显示结果
for corner in corners:x, y = corner.ravel()cv2.circle(image, (int (x), int(y)), 3, (255, 0, 255), -1)cv2.imshow('image', image)
cv2.waitKey(0)
结果:
7.模板匹配扑克牌上的菱形
目标是匹配扑克牌上的菱形,这张图片上一共有九个菱形,把它们都找出来。
import cv2
import numpy as np
image = cv2.imread('poker.jpg')
#把彩色图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#选取图像的一个区域作为匹配模板,使用索引横行75~105,纵列235~265,这个区域刚好包含一个菱形
template = gray[75:105,235:265]
#把带检测图像和模板都各自标准化,再来计算匹配度,这样可以保证匹配结果不受光照强度的影响
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
#找出匹配系数大于0.9的匹配点,再把模板图案的长和宽求出来
locations = np.where(match >= 0.9)
w,h = template.shape[0:2]
#循环遍历每一个匹配点,在原始图像上画出对应的矩形框,显示结果,9个菱形都被找到了。
for p in zip(*locations[::-1]):x1,y1 = p[0], p[1]x2,y2 = x1 + w, y1 + hcv2.rectangle(image, (x1,y1), (x2,y2), (0, 255, 0), 2)cv2.imshow('image', image)
cv2.waitKey(0)
结果:
8.图像的梯度算法与边缘检测
import cv2
#读取图像的灰度图
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
#拉普拉斯算子给出了图像明暗变化的趋势
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
#canny边缘检测
canny = cv2.Canny(gray, 100, 200)
cv2.imshow("gray", gray)
cv2.imshow("Laplacian", laplacian)
cv2.imshow("Canny", canny)
cv2.waitKey(0)
结果:
9.图像的二值化(阈值:非黑即白)
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,2)
ret1,binary_otsu = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)cv2.imshow('gray',gray)
cv2.imshow('binary',binary)
cv2.imshow('binary_adaptive',binary_adaptive)
cv2.imshow('binary_otsu',binary_otsu)
cv2.waitKey(0)
结果:
10.图像形态学之腐蚀和膨胀
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)
#腐蚀
erosion = cv2.erode(binary, kernel)
#膨胀
dilation = cv2.dilate(binary, kernel)
cv2.imshow("binary", binary)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.waitKey(0)
结果:
11.调用电脑摄像头
import cv2
#电脑上只有一个摄像头,所以序号是零
capture = cv2.VideoCapture(0)
#对于摄像头的采集是连续不断的,也就是说要循环读取每一帧的画面,
# 由于不确定循环多少次,我们先让它做死循环
while True:ret, frame = capture.read()# 读取摄像头中的画面,把它展示出来cv2.imshow('frame', frame)key = cv2.waitKey(1)if key != -1:break
#释放指针
capture.release()
结果: