目录
import cv2
import numpy as np
import matplotlib.pyplot as plt
图像读取与显示
- 图像读取
cv2.MREAD_COLOR: 彩色图像 或用1
cv2.IMREAD_GRAYSCALE:灰度图像 或用0
img = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)
等同于: img = cv2.imread('cat.jpg', 0)
python
img = cv2.imread("D:/OpenCV_code/bank_card/temp.jpg")
# 通过这样指定其他路径的文件图像
- 图像的显示,也可以创建多个窗口
cv2.imshow('img', img)
- 等待时间,毫秒级,0表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
- 连接多张图片
横着连:res = np.hstack(img1,img2,img3)
竖着连:res = np.vstack(img1,img2,img3)
- 截取部分图像数据
img = cv2.imread('cat.jpg')
cat = img[0:200, 0:200] #切片
读取视频与查看属性
cv2.VideoCapture(source)可以捕获摄像头,用数字来控制不同的设备,例如0,1;如果是视频文件,直接制定好路径即可
source 取值 | 功能 |
---|---|
0 | 获取笔记本电脑本机摄像头 |
文件及路径 | 获取视频文件 |
python
vc = cv2.VideoCapture('test.mp4')`
#检查是否打开正确`
if vc.isOpened():`
open, frame = vc.read()`
else:`
open = False`
while open:`
ret, frame = vc.read()
if frame is None:`
break`
if ret == True:`
gray = cv2.cvColor(frame, cv2.COLOR_BGR2GRAY)`
cv2.imshow('result', gray)`
if cv2.waitKey(10) & OxFF == 27: #等待一段时间或按ESC`
break`
vc.release`
cv2.destroyAllWindows()`
python
import cv2
cap = cv2.VideoCapture('Forest.mp4')
while cap.isOpened():
ret, frame = cap.read()
# 调整窗口大小
# 0可调大小,注意:窗口名必须imshow里面的一窗口名一直
cv2.namedWindow("frame", 0)
# 设置长和宽
cv2.resizeWindow("frame", 1600, 900)
#运行显示
cv2.imshow('frame', frame)
#q键退出运行窗口【英文状态下】
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
此外可以通过cv2.VideoCapture.get()和.set()查看、更改视频属性。
OpenCV-Python设置曝光、对比度等参数_南沐ヾ的博客-CSDN博客_opencv python 对比度
图像保存
cv2.imwrite('mycat.png', img)
区分:
img2 = img1 img2和img1指定同一幅图像
img2 = img1.copy() img2和img1指定两幅相同的图像
保存视频
cv2.VideoWriter()
VideoWriter(filename, fourcc, fps, frameSize[, isColor]) ->
- 第一个参数是要保存的文件的路径
- fourcc 指定编码器
- fps 要保存的视频的帧率
- frameSize 要保存的文件的画面尺寸
- isColor 指示是黑白画面还是彩色的画面
python
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('testwrite.avi',fourcc, 20.0, (1920,1080),True)
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
cv2.imshow('frame',frame)
out.write(frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
图像属性打印
-
img.shape --> (h,w,c) c,表示层数,3为彩图,在opencv中为BGR;灰度图只有(h,w)
-
type(img) --> numpy.ndarray
-
img.size --> 像素点个数
-
img.dtype --> dtype('uint8') 数据类型
-
图像颜色通道提取
python
b,g,r = cv2.split(img)
b --> b通道像素点矩阵值
b.shape --> (h,w) #三个通道相同(一张图)
#只保留R通道,显示红色
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0 #提取R单通道,故按顺序BGR把0(代表B)、1(代表G)置为0
cv_show('R',cur_img)
- cv2.split()和cv2.merge()函数
cv2.split():分离图像的BGR,cv2.merge():根据BGR值重新融合出图像
遍历图像的所有像素点的RGB值
python
import cv2
import numpy as np
np.set_printoptions(threshold=np.nan) # 这里多加一行代码,避免控制台输出省略号的问题
pic_path = "../01.jpg" # 图片路径
img = cv2.imread(pic_path)
for x in range(img.shape[0]): # 图片的高
for y in range(img.shape[1]): # 图片的宽
px = img[x,y]
print(px) # 这样就能得到每个点的bgr值
图像边界填充
先指定图像上下左右填充的值大小
top_size,bottom_size,left_size,right_size = (50,50,50,50)
函数
cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)
-
src:原图像
-
top,bottem,left,right:分别表示四个方向上边界的长度
-
borderType:边界的类型 以abcdef为例
cv2.BORDER_CONSTANT 固定值填充,value为颜色值
cv2.BORDER_REFLECT 边界元素的镜像,填充的边界与原图像边界对称,成镜像,fedcba
cv2.BORDER_DEFAULT 边界元素的镜像,填充的边界与原图像边界(忽略第一个元素)对称,成镜像,gfedcb
cv2.BORDER_REPLICATE 用原图像边界的第一个元素进行填充,aaaaa
cv2.BORDER_WRAP 取上下左右相反的镜像
-
value:如果borderType为cv2.BORDER_CONSTANT时需要填充的常数值
举例:
python
`import cv2`
`import numpy as np`
`import matplotlib.pyplot as plt`
`img = cv2.imread('sugar.jpg')`
`##画图`
`def draw_img(i,img,title):`
`plt.subplot(2,3,i)`
`plt.imshow(img)`
`plt.axis('off')`
`plt.title(title)`
`##BGR转RGB`
`img_rgb = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2RGB)`
`##边界填充`
`constant = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value=[255, 0, 0])`
`reflect = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_REFLECT)`
`default = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_DEFAULT)`
`replicate = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_REPLICATE)`
`wrap = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_WRAP)`
`##画图`
`draw_img(1,img_rgb,'original')`
`draw_img(2,constant,'constant')`
`draw_img(3,reflect,'reflect')`
`draw_img(4,default,'default')`
`draw_img(5,replicate,'replicate')`
`draw_img(6,wrap,'wrap')`
`plt.show()`
数值计算
img1 = img1 + 10 :
img的G、B、R三个图层的每个像素点的亮度都增加10
也可以是两个图相加
img1+img2
对应相同位置像素点数值相加,范围仍是0-255,超过255取余数
add(img1,img2)
两图对应的相同位置像素点数值相加,结果大于等于255就取255,小于255就取数值相加的值本身
图像大小变化
img1 = cv2.resize(img1, (500, 200))
其中(500,200)代表img1要改变成的shape值的长和宽
img1 = cv2.resize(img1, (0, 0), fx=1, fy=3)
前面不设具体值,用fx、fy表示与原图像x、y的倍数关系,伸缩图像大小
图像窗口滑动条的创建和使用
createTrackbar() 这个函数用于创建一个可以调整数值的滑动条,并将滑动条附加到指定的窗口上。
滑动条(Trackbar)是一种可以动态调节参数的工具,它依附于窗口而存在。
函数参数:
def createTrackbar(trackbarName, windowName, value, count, onChange)
具体含义为:
- trackbarname:跟踪栏名称,创建的轨迹栏的名称。
- Winname:窗口的名字
- value 该变量的值反映滑块的初始位置。
- count 表示滑块可以达到的最大位置的值
- onChange:回调函数,每次滑动都会调用回调函数。
cv2.getTrackbarPos(trackbarname, winname) → retval
参数:
第一个:滑动条名
第二个:窗口名
返回值:指定窗口上指定滑动条的当前位置
使用方法
方法一:即先定义createTrackbar() 滑动条,再调用getTrackbarPos获取createTrackbar的返回值用变量储存,进行这样的交互操作。
方法二:也可直接调用createTrackbar() 函数,直接就运行函数,进而反复调用createTrackbar()的第五个参数------自定义函数中进行操作也可。在自定义函数中调用getTrackbarPos获取createTrackbar的返回值用变量储存,再进行交互操作。
即一个不用reateTrackbar()的第五个参数,一个用。
鼠标操作
小白学pyhon(opencv鼠标操作)_mcl19909949541的博客-CSDN博客
【Python+OpenCV入门学习】六、鼠标操作_楚俊慕的博客-CSDN博客
鼠标交互操作主要通过两个函数实现:
第一个是cv2.setMouseCallback(windowName, onMouse [, param])
第二个是**setMouseCallback()**的第二个参数,称为鼠标回调函数onMouse(event, x, y, flags, param)
cv2.setMouseCallback(windowName, onMouse [, param])
第一个是你打开的窗口名字(要对应)
第二个是你定义的鼠标事件函数(任意)
鼠标回调函数:onMouse(event, x, y, flags, param)
这个参数列表不要改变它,除了param外其他都是由回调函数自动获取值。
- event:由回调函数根据鼠标对图像的操作自动获得,内容包含左键点击,左键弹起,右键点击...等等等非常多的操作。
- x,y:由回调函数自动获得,记录了鼠标当前位置的坐标,坐标以图像左上角为原点(0, 0),x方向向右为正,y方向向下为正
- flags:记录了一些专门的操作
- param:从setMouseCallback()里传递过来的参数。该参数在setMouseCallback()处是可选参数,所以可以不设置。
param即为我们向里面传的图片参数
python
# event:
EVENT_LBUTTONDBLCLK = 7 左键双击
EVENT_LBUTTONDOWN = 1 左键点击
EVENT_LBUTTONUP = 4 左键释放
EVENT_MBUTTONDBLCLK = 9 中间释放
EVENT_MBUTTONDOWN = 3 中间点击
EVENT_MBUTTONUP = 6 中间释放
EVENT_MOUSEHWHEEL = 11 滚轮事件
EVENT_MOUSEMOVE = 0 滑动
EVENT_MOUSEWHEEL = 10 滚轮事件
EVENT_RBUTTONDBLCLK = 8 右键双击
EVENT_RBUTTONDOWN = 2 右键点击
EVENT_RBUTTONUP = 5 右键释放
# flags:
EVENT_FLAG_ALTKEY = 32 按Alt不放事件
EVENT_FLAG_CTRLKEY = 8 按Ctrl不放事件
EVENT_FLAG_LBUTTON = 1 左键拖拽
EVENT_FLAG_MBUTTON = 4 中键拖拽
EVENT_FLAG_RBUTTON = 2 右键拖拽
EVENT_FLAG_SHIFTKEY = 16 按Shift不放事件