基础使用
一、测试基本功能
# 展示版本号
import cv2 as cv
print(cv.__version__)
# imread读取路径下的图片
# samples.findFile是提取图片路径
starry_night = cv.samples.findFile("D://dev/opencv/sources/samples/data/starry_night.jpg")
starry_night = cv.imread(starry_night)
cv.imshow("yang", starry_night)
cv.waitKey(0)
二、图片的读写
显示窗口
namedWindow(winname, flags)
flags | 窗口的创建模式 |
---|---|
WINDOW_NORMAL | 窗口大小可以被用户调整,这是默认值 |
WINDOW_AUTOSIZE | 窗口大小会自动调整以适应显示的图像,用户不能手动改变窗口大小。 |
WINDOW_KEEPRATIO | 保持图像的宽高比 |
WINDOW_FREERATIO | 图像宽高比可以改变 |
WINDOW_GUI_EXPANDED | 窗口带有工具栏和状态栏 |
WINDOW_GUI_NORMAL | 窗口不带工具栏和状态栏 |
调整窗口大小
resizeWindow(winname, width, height)
读写图片
imread(“path”)
imwrite(“path”, image)
释放所有窗口
destroyAllWindows()
import cv2 as cv
cv.namedWindow("image", cv.WINDOW_NORMAL)
cv.resizeWindow("image", 752, 600)
image = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
cv.imshow("image", image)
while True:
key = cv.waitKey(0)
if key & 0xFF == ord('q'):
break
elif key & 0xFF == ord('s'):
cv.imwrite("C://Users/36188/Desktop/starry_night_copy.png", image)
cv.destroyAllWindows()
三、尝试读取摄像头信息
import cv2 as cv
# 获得摄像头的分辨率
cap = cv.VideoCapture(0)
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
cv.namedWindow("video", cv.WINDOW_NORMAL)
cv.resizeWindow("video", width, height)
while True:
# ret检测是否读取视频帧,frame接受读取的帧
ret, frame = cap.read()
cv.imshow("video", frame)
key = cv.waitKey(1)
if key & 0xFF == ord("q"):
break
# 释放VideoCapture
cap.release()
cv.destroyAllWindows()
四、尝试读取本地视频文件
# 采集本地文件
import cv2 as cv
cap = cv.VideoCapture("D://dev/opencv/sources/samples/data/vtest.avi")
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
cv.namedWindow("video", cv.WINDOW_NORMAL)
cv.resizeWindow("video", width, height)
while True:
# ret检测是否读取视频帧,frame接受读取的帧
ret, frame = cap.read()
if not ret:
# 已播放完视频或者视频损坏
break
cv.imshow("video", frame)
key = cv.waitKey(1)
if key & 0xFF == ord("q"):
break
# 释放VideoCapture
cap.release()
cv.destroyAllWindows()
五、保存视频文件
# 保存视频文件
import cv2 as cv
# 获取分辨率
cap = cv.VideoCapture(0)
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
# 创建窗口
cv.namedWindow("video", cv.WINDOW_NORMAL)
cv.resizeWindow("video", width, height)
fourcc = cv.VideoWriter_fourcc(*"MP4v")
vw = cv.VideoWriter("C://Users/36188/Desktop/out.mp4", fourcc, 25, (width, height))
while cap.isOpened():
# ret检测是否读取视频帧,frame接受读取的帧
ret, frame = cap.read()
if ret:
cv.imshow("video", frame)
# 将窗口重置为width*height
cv.resizeWindow("video", width, height)
vw.write(frame)
key = cv.waitKey(1)
if key & 0xFF == ord("q"):
break
else:
break
# 释放VideoCapture
# 释放VideoWriter
cap.release()
vw.release()
cv.destroyAllWindows()
六、鼠标回调函数
import cv2 as cv
import numpy as np
def mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
cv.namedWindow("mouse", cv.WINDOW_NORMAL)
cv.resizeWindow("mouse", 640, 360)
# 设置鼠标回调
cv.setMouseCallback("mouse", mouse_callback, "userdata")
# 三层通道的零矩阵
img = np.zeros((360, 640, 3), dtype=np.uint8)
while True:
cv.imshow("mouse", img)
key = cv.waitKey(1)
if key & 0xFF == ord("q"):
break
cv.destroyAllWindows()
七、设置trackbar
import cv2 as cv
import numpy as np
# 创建一个三层通道零矩阵
img = np.zeros((480, 640, 3), np.uint8)
def callback(x):
global r, g, b, img
# 获得trackbar的值
r = cv.getTrackbarPos("R", "trackbar")
g = cv.getTrackbarPos("G", "trackbar")
b = cv.getTrackbarPos("B", "trackbar")
# 更改图片颜色
img[:] = [b, g, r]
# 创建窗口
cv.namedWindow("trackbar", cv.WINDOW_NORMAL)
cv.resizeWindow("trackbar", 640, 480)
cv.createTrackbar("R", "trackbar", 0, 255, callback)
cv.createTrackbar("G", "trackbar", 0, 255, callback)
cv.createTrackbar("B", "trackbar", 0, 255, callback)
while True:
cv.imshow("trackbar", img)
key = cv.waitKey(10)
if key & 0xFF == ord("q"):
break
cv.destroyAllWindows()
八、对图片进行色域转换
import cv2 as cv
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img2 = img
def callback(x):
global index, img
index = cv.getTrackbarPos("curcolor", "color")
img = cv.cvtColor(img2, colorspaces[index])
cv.namedWindow("color", cv.WINDOW_NORMAL)
cv.resizeWindow("color", 752, 600)
colorspaces = [cv.COLOR_BGR2RGBA, cv.COLOR_BGR2GRAY,
cv.COLOR_BGR2HSV_FULL, cv.COLOR_BGR2YUV]
cv.createTrackbar("curcolor", "color", 0, 3, callback)
while True:
cv.imshow("color", img)
key = cv.waitKey(10)
if key & 0xFF == ord("q"):
break
cv.destroyAllWindows()
九、利用图片索引修改
import cv2 as cv
import numpy as np
img = np.zeros((480, 640, 3), dtype=np.uint8)
cv.namedWindow("image", cv.WINDOW_NORMAL)
cv.resizeWindow("image", 640, 480)
count = 0
while count < 200:
img[count, 100] = [0, 0, 255]
count += 1
# 利用索引[y1:y2,x1:x2]
# img[0:200, 100] = [0, 0, 255]
cv.imshow("image", img)
key = cv.waitKey(0)
if key & 0xFF == ord("q"):
cv.destroyAllWindows()
十、深拷贝和浅拷贝
import cv2 as cv
import numpy as np
# 浅拷贝,同步内容变更,只拷贝header部分,共享data部分
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img2 = img
# 深拷贝,不同步内容变更,同时拷贝header和data部分
img3 = np.copy(img)
img[10:100, 10:100] = [0, 0, 255]
cv.imshow("img", img)
cv.imshow("img2", img2)
cv.imshow("img3", img3)
cv.waitKey(0)
# 用numpy的shape方法得到图片矩阵的形状
print(np.shape(img))
# 图片矩阵的大小等于宽×高×层数(通道数)
print(np.size(img))
# 图片矩阵的dtype参数,即图片的位深(8号无符号数)
print(img.dtype)
十一、图片的分离和合并
import cv2 as cv
import numpy as np
img = np.zeros((480, 640, 3), dtype=np.uint8)
# 分成三个通道,b, g, r分别存储三个通道的二维矩阵
b, g, r = cv.split(img)
# 修改部分值
b[10:100, 10:100] = 255
g[10:100, 10:100] = 255
# 将修改后的三通道合并为一个三层通道的图片
img2 = cv.merge((b, g, r))
cv.imshow("img", img)
cv.imshow("b", b)
cv.imshow("g", g)
cv.imshow("img2", img2)
cv.waitKey(0)
十二、利用opencv画图形
import cv2 as cv
import numpy as np
# 白色背景
img = 254 + np.zeros((480, 640, 3), dtype=np.uint8)
# 线line(img,起始点,终止点,颜色,线宽,线形(默认8,有4,8,16))
cv.line(img, (0, 0), (640, 480), (0, 0, 255), 5, 16)
# 矩形rectangle(img,起始点,终止点,颜色,填充度(-1是全填充))
cv.rectangle(img, (0, 0), (120, 200), (255, 0, 0), -1)
# 圆形circle(img,圆心,半径,颜色,填充度(-1是全填充))
cv.circle(img, (320, 240), 200, (0, 255, 0), -1)
# 椭圆ellipse(img,中心点,(a, b),角度,起始角度,终止角度,颜色,填充度)
# 角度是按顺时针算
cv.ellipse(img, (320, 240), (200, 150), 0, 0, 360, (0, 0, 255), -1)
# 自定义多边形,polylines(img,32位符号点集,是否连接,颜色,填充)
# 填充多边形,fillPoly(img,点集,颜色)
pts = np.array([(0, 0), (0, 480), (640, 480)], dtype=np.int32)
cv.polylines(img, [pts], True, (0, 0, 255))
cv.fillPoly(img, [pts], (255, 0, 0))
# 绘制文本putText(img,字符串,起始点,字体(0-7),字号,颜色)
cv.putText(img, "Hello World", (10, 400), 3, 3, (0, 0, 255))
cv.imshow("img", img)
cv.waitKey(0)
十三、鼠标在图片上绘制图形
import cv2 as cv
import numpy as np
curshape = 0
startpos = (0, 0)
def mouse_callback(event, x, y, flags, userdata):
global curshape, startpos
if event & cv.EVENT_LBUTTONDOWN == cv.EVENT_LBUTTONDOWN:
startpos = (x, y)
elif event & cv.EVENT_LBUTTONUP == cv.EVENT_LBUTTONUP:
if curshape == 0:
cv.line(img, startpos, (x, y), (0, 0, 255))
elif curshape == 1:
cv.rectangle(img, startpos, (x, y), (0, 0, 255))
elif curshape == 2:
radius = int(((x - startpos[0]) ** 2 +
(y - startpos[1]) ** 2) ** 0.5)
cv.circle(img, startpos, radius, (0, 0, 255))
else:
print("error:no shape")
cv.namedWindow("drawshape", cv.WINDOW_NORMAL)
cv.setMouseCallback("drawshape", mouse_callback, "123")
img = np.zeros((480, 640, 3), dtype=np.uint8)
while True:
cv.imshow("drawshape", img)
key = cv.waitKey(1) & 0xFF
if key == ord("q"):
break
# draw lines
elif key == ord("l"):
curshape = 0
# draw rectangles
elif key == ord("r"):
curshape = 1
# draw circles
elif key == ord("c"):
curshape = 2
cv.destroyAllWindows()
十四、图片运算
import cv2 as cv
import numpy as np
squirrel = cv.imread("D://dev/opencv/sources/samples/data/squirrel_cls.jpg")
img = np.ones(squirrel.shape, dtype=np.uint8) * 100
# 图片的加减法
result = cv.add(squirrel, img)
result2 = cv.subtract(result, img)
# 乘法除法同理
# cv.multiply(A, B)
# cv.divide(A, B)
# 图片相溶
img1 = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img2 = cv.imread("D://dev/opencv/sources/samples/data/small_cat.jpg")
# 图片属性相同
img3 = cv.addWeighted(img1, 0.3, img2, 0.7, 0)
cv.imshow("orig", squirrel)
cv.imshow("result", result)
cv.imshow("result2", result2)
cv.imshow("img3", img3)
cv.waitKey(0)
十五、图片逻辑运算
import cv2 as cv
import numpy as np
img = np.zeros((200, 200), dtype=np.uint8)
img2 = img.copy()
img3 = 254 + img2
img[50:150, 50:150] = 255
# NOT运算:bitwise_not
not_img = cv.bitwise_not(img)
# AND运算:bitwise_and
and_img = cv.bitwise_and(img, img2)
# OR运算:bitwise_or
or_img = cv.bitwise_or(img, img3)
# XOR同理
# 实例:为图片添加水印
small_cat = cv.imread("D://dev/opencv/sources/samples/data/small_cat.jpg")
logo = np.zeros((200, 200, 3), dtype=np.uint8)
mask = np.zeros((200, 200), dtype=np.uint8)
logo[20:120, 20:120] = [0, 0, 255]
logo[80:180, 80:180] = [0, 255, 0]
mask[20:120, 20:120] = 255
mask[80:180, 80:180] = 255
mask = cv.bitwise_not(mask)
roi = small_cat[0:200, 0:200]
# 抠出logo的位置,三通道与操作
tmp = cv.bitwise_and(roi, roi, mask=mask)
dst = cv.add(logo, tmp)
small_cat[0:200, 0:200] = dst
cv.imshow("img", img)
cv.imshow("not_img", not_img)
cv.imshow("and_img", and_img)
cv.imshow("or_img", or_img)
cv.imshow("small_cat", small_cat)
cv.waitKey(0)