OpenCV学习<一>
一.图像基本操作
1.1使用的库
cv2 matplotlib numpy
正常直接导入即可
import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np
1.2数据读取-图像
例程:将如图导入展示并保存
import cv2
import matplotlib.pyplot as plt
import numpy as np
img=cv2.imread('../photo/cat.jpg')
cv2.imshow("img",img)
while cv2.waitKey(0) != -1 :
cv2.destroyAllWindows()
cv2.imwrite('../save/cat_cg.jpg',img)
break
1.2.1图像读取
函数:cv.imread(filename,[flags])
作用:从文件加载图像。函数 imread 从指定文件加载图像并返回它。如果无法读取图像(由于缺少文件、权限不当、格式不受支持或无效),该函数将返回一个空矩阵 。
参数:filename:文件的路径
flags:读取的方式,通常有默认值=IMREAD_COLOR
1.2.2图像显示
函数:cv.imshow(winname, mat)
作用:函数 imshow 在指定的窗口中显示图像。如果窗口是使用 cv::WINDOW_AUTOSIZE 标志创建的,则图像将以其原始大小显示,但仍受屏幕分辨率的限制。否则,图像将缩放以适合窗口。该函数可能会缩放图像,具体取决于其深度:
参数:winname:窗口名称
mat:要显示的图像
1.2.3等待按下的键
函数:cv.waitKey([delay])
作用:函数waitKey 无限期地等待密钥事件(当延迟≤0) 或延迟毫秒,当它为正时。由于操作系统在切换线程之间具有最短的时间,因此该函数不会完全延迟毫秒,它将至少等待延迟毫秒,具体取决于当时计算机上正在运行的其他内容。它返回按下的键的代码,如果在指定的时间过去之前没有按下任何键,则返回 -1。
参数:delay:延长的时间
1.2.4销毁所有窗口
函数:cv.destroyAllWindows()
作用:销毁所有 HighGUI 窗口。
该函数 destroyAllWindows 会销毁所有打开的 HighGUI 窗口。
参数:无
1.2.5保存图像
函数:cv.imwrite( filename,img,[params])
作用:将图像保存到指定文件。
函数imwrite将图像保存到指定的文件中
参数:filename:文件的名称目录
img:图像或要保存的图像
param:特定于格式的参数,通常为默认值,请参见 cv::ImwriteFlags
1.3数据读取-视频
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
vc = cv.VideoCapture('../photo/test.mp4')
if vc.isOpened():
open , frame = vc.read()
while open :
cv.imshow('video',frame)
open, frame = vc.read()
if cv.waitKey(10) & 0xFF == ord('q'):
break
1.3.1打开视频
函数:cv.VideoCapture(filename)
作用:打开视频文件或捕获设备或 IP 视频流,以便使用 API 首选项捕获视频。
参数:filename:文件目录
1.3.2判断视频是否捕获
函数: cv.VideoCapture.isOpened()
作用:如果视频捕获已初始化,则返回 true。
参数:无
1.3.3读取
函数:cv.VideoCapture.read()
作用:该方法/函数在一次调用中结合了 VideoCapture::grab() 和 VideoCapture::retrieve()。这是读取视频文件或从解码中捕获数据并返回刚刚抓取的帧的最方便方法。如果未抓取任何帧(相机已断开连接,或者视频文件中没有更多帧),则该方法返回 false,函数返回空图像,会返回两个值
参数:无
1.4截取部分图像数据
1.4.1截取数据
使用数组的方式,例:
img=cv2.imread('cat.jpg')
cat=img[0:200,0:200]
cv_show('cat',cat)
1.5颜色通道获取
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('../photo/cat.jpg')
b , g , r = cv2.split(img)
cur_img_r = img.copy()
cur_img_r[:,:,0] = 0
cur_img_r[:,:,1] = 0
cv2.imshow('R',cur_img_r)
cur_img_g = img.copy()
cur_img_g[:,:,0] = 0
cur_img_g[:,:,2] = 0
cv2.imshow('G',cur_img_g)
cur_img_b = img.copy()
cur_img_b[:,:,2] = 0
cur_img_b[:,:,1] = 0
cv2.imshow('B',cur_img_b)
while cv2.waitKey(0) != -1 :
cv2.destroyAllWindows()
cv2.imwrite('../save/cur_img_r.jpg', cur_img_r)
cv2.imwrite('../save/cur_img_g.jpg', cur_img_g)
cv2.imwrite('../save/cur_img_b.jpg', cur_img_b)
break
1.5.1提取单通道颜色
函数:cv.split(img)
作用:将多通道阵列划分为多个单通道阵列。返回值通常有三个即:B,G,R
参数:img:图片
1.5.2混合通道颜色
函数:cv.merge(b,g,r)
作用:从多个单通道阵列中创建一个多通道阵列
参数:三个单通道
1.6边界填充
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('../photo/cat.jpg')
top_size,bottom_size,left_size,right_size = (50,50,50,50)
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
plt.show()
while cv2.waitKey(0) != -1 :
cv2.destroyAllWindows()
break
1.6.1填充边界
函数:cv2.copyMakeBorder(src,top,bottom,left,right)
作用:给你的图片设置边界框,就像一个相框一样的东西
参数:src : 输入的图片
top, bottom, left, right :相应方向上的边框宽度
borderType:定义要添加边框的类型,它可以是以下的一种:
- BORDER_REPLICATE:复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
- BORDER_CONSTANT:常量法,常数值填充。
1.7数值计算
两图片相加相当于相同位置的数组相加,超过255的即对256取余处理