Opencv学习笔记三(像素归一化,视频读写,图像翻转,图像插值,几何图形绘制)

像素归一化

opencv中提供了四种归一化的方法

  • NORM_MINMAX 像素值减min除以max-min
  • NORM_INF 选择最大像素值作为除数
  • NORM_L1 单个像素值除以所有像素值和
  • NORM_L2 单个像素值除以所有像素值平方的和开根号

相关API函数:

normalize( 
InputArray src, // 输入图像 
InputOutputArray dst, // 输出图像 
double alpha = 1, // NORM_MINMAX时候低值 
double beta = 0, // NORM_MINMAX时候高值 
int norm_type = NORM_L2, // 只有alpha 
int dtype = -1, // 默认类型与src一致 
InputArray mask = noArray() // mask默认值为空 
)

像素归一化根据各个像素点的像素值,通过莫种方法将元素值重新计算

由于归一化中存在除法,所以像素值会出现小数,所以图像类型应为浮点类型

src=cv.imread("D:/lena.jpg")
cv.namedWindow("input",cv.WINDOW_AUTOSIZE)
cv.imshow("input",src)
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)

#转换为浮点数类型数组
gray=np.float32(gray)
print(gray)

#scale and shift by NORM_MINMAX
dst=np.zeros(gray.shape,dtype=np.float32)
cv.normalize(gray,dst=dst,alpha=0,beta=1.0,norm_type=cv.NORM_MINMAX)
print(dst)
cv.imshow("NORM_MINMAX",np.uint8(dst*255))

#scale and shift by NORM_INF
dst=np.zeros(gray.shape,dtype=np.float32)
cv.normalize(gray,dst=dst,alpha=1.0,beta=0,norm_type=cv.NORM_INF)
print(dst)
cv.imshow("NORM_INF",np.uint8(dst*255))

#scale and shift by NORM_L1
dst=np.zeros(gray.shape,dtype=np.float32)
cv.normalize(gray,dst=dst,alpha=1.0,beta=0,norm_type=cv.NORM_L1)
print(dst)
cv.imshow("NORM_L1",np.uint8(dst*10000000))

#scale and shift by NORM_L2
dst=np.zeros(gray.shape,dtype=np.float32)
cv.normalize(gray,dst=dst,alpha=1.0,beta=0,norm_type=cv.NORM_L2)
print(dst)
cv.imshow("NORM_L2",np.uint8(dst*10000))

cv.waitKey(0)
cv.destroyAllWindows()

视频的读写

VideoCapture 视频文件读取、摄像头读取、视频流读取

VideoWriter 视频保存

  • CAP_PROP_FRAME_HEIGHT 高度
  • CAP_PROP_FRAME_WIDTH 宽度
  • CAP_PROP_FRAME_COUNT 帧大小
  • CAP_PROP_FPS 每秒播放、处理的帧数

不支持音频的编码和解码

#capture=cv.VideoCapture("D:/tree.avi")#打开视频文件
capture=cv.VideoCapture(0)#打开摄像头
'''
height=capture.get(cv.CAP_PROP_FRAME_HEIGHT)#视频的高
width=capture.get(cv.CAP_PROP_FRAME_WIDTH)#视频的宽
count=capture.get(cv.CAP_PROP_FRAME_COUNT)#视频的帧数
fps=capture.get(cv.CAP_PROP_FPS)#每秒播放多少帧
print(height,width,count,fps)
'''
out=cv.VideoWriter("D:/test1.mp4",cv.VideoWriter_fourcc('D','I','V','X'),15,
(np.int(width),np.int(height)),True)#保存视频文件
#录像在屏幕上的显示
whileTrue:
ret,frame=capture.read()
if ret is True:
cv.imshow("video-input",frame)
out.write(frame)
c=cv.waitKey(50)
if c==27:#ESC
break
else:
break

capture.release()
out.release()

图像翻转

图像翻转的本质是像素映射,OpenCV支持三种图像翻转方式

  • X轴翻转,flipcode = 0
  • Y轴翻转, flipcode = 1
  • XY轴翻转, flipcode = -1

相关API:

flip()

  • src输入参数

  • dst 翻转后图像

  • flipcode

dst1 = cv.flip(src,0)
cv.inshow("x-flip",dst1)

dst2 = cv.flip(src,1)
cv.inshow("y-flip",dst2)

dst3 = cv.flip(src,-1)
cv.inshow("xy-flip",dst3)

图像插值

最常见四种插值算法

  • INTER_NEAREST = 0 临近点插值

  • INTER_LINEAR = 1 双线性插值

  • INTER_CUBIC = 2 双立方插值

  • INTER_LANCZOS4 = 4 卢卡斯插值

其实,插值通俗点讲就是添加像素点,图像放大,多出来的位置肯定要加上像素值

src = cv.imread("D:/lena.jpg")
h , w =src.shape[:2]
dst1= cv.resize(src,(h*2,w*2),fx=0,fy=0,interpolation=cv.INTER_NEAREST)
cv.imshow("INTER_NEAREST",dst1)
dst2= cv.resize(src,(h*2,w*2),interpolation=cv.INTER_LINEAR)
cv.imshow("INTER_LINEAR",dst2)
dst3= cv.resize(src,(h*2,w*2),interpolation=cv.INTER_CUBIC)
cv.imshow("INTER_CUBIC",dst3)
dst4= cv.resize(src,(h*2,w*2),interpolation=cv.INTER_LANCZOS4)
cv.imshow("INTER_LANCZOS4",dst4)
cv.waitKey(0)
cv.destroyAllWindows()

几何形状绘制

几何形状绘制

绘制几何形状

  • 绘制直线
  • 绘制圆
  • 绘制矩形
  • 绘制椭圆

填充几何形状

OpenCV没有专门的填充方法,只是把绘制几何形状时候的线宽

  • thickness参数值设置为负数即表示填充该几何形状或者使用参数CV_FILLED

随机数方法:

RNG 表示OpenCV C++版本中的随机数对象

rng.uniform(a, b)生成[a, b)之间的随机数,包含a,但是不包含b。

np.random.rand()

表示numpy中随机数生成,生成浮点数0~1的随机数, 包含0,不包含1

详情见我另一篇博客

几何图形绘制

你可能感兴趣的:(Opencv学习笔记三(像素归一化,视频读写,图像翻转,图像插值,几何图形绘制))