OpenCV从入门到进阶(一)

news/2024/11/17 18:35:26/

文章目录

  • opencv入门到进阶
    • 一、图像与视频的加载与展示:
      • 1、创建和显示窗口 import cv2
      • 2、 加载图片
      • 3、 保存图片
      • 4、 视频采集
      • 5、 读取视频文件
      • 6、 视频录制
      • 7、 鼠标控制
      • 8、 TrackBar控件

opencv入门到进阶

一、图像与视频的加载与展示:

1、创建和显示窗口 import cv2

图像入门

● namedWindow(): 创建一个窗口,并给窗口起一个名字

参数:WINDOW_NORMAL:可调整窗口大小WINDOW_AUTOSIZE:不可调整窗口大小cv2.namedWindow('new',cv2.WINDOW_NORMAL)

● resizeWindow(‘name’,‘high’,‘width’):设置对应窗口大小

● imshow():显示窗口,参数:窗口名

● waitKey():窗口展示时间,单位ms ——>用来监听键盘和鼠标事件 0:一直显示监听键盘事件,如果输入q,则退出窗口

示例1

key=cv2.waitKey(0)  #监听到的事件返回给key
if(key=='q'):exit()

● destroyAllWindows():销毁窗口,释放系统资源

2、 加载图片

● imread(path,flag):

IMREAD_COLOR=1:加载彩色图像,任何图像的透明度都会被忽略IMREAD_GRAYSCALE=0:以灰度模式加载图片IMREAD_UNCHANGED=-1:加载图像,包括alpha通道

Note:

● 你可以简单地分别传递整数1、0、-1,而不是这三个flag● 如果你使用的是 64 位机器,你需要修改key = cv.waitKey(0)像这样:key = cv.waitKey(0) & 0xFF● 值得注意的是,如果文件的路径中包含有中文就会报错提供以下解决方法[采用了用numpy中的fromfile读取文件](https://blog.csdn.net/zhangycode/article/details/107936120 "采用了用numpy中的fromfile读取文件")

示例2

import cv2cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread("./img/img_1.jpg", 1)
cv2.imshow('image', img)
key = cv2.waitKey(0)
#改进:因为key实际得到的是输入指令的ascall所以,输入q不会退出
#只需要ord('q'),让他默认为ascall即可#waitKey()返回的是int型,16位
#但是ascall是8位的,因此最严谨的写法为:
#取key的最后8位
if (key & 0xFF== ord('q')):cv2.destroyAllWindow()

3、 保存图片

● imwrite(name,img)

name,要保存的文件名img,是Mat类型

示例3

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread("./img/img_1.jpg", 1)
while True:cv2.imshow('image', img)key = cv2.waitKey(0)if (key & 0xFF== ord('q')):breakelif(key & 0xFF== ord('s')):#将图片保存到。。。。cv2.imwrite("./img/img_1_1.jpg",img)else:print("请重新输入")
cv2.destroyAllWindows()

4、 视频采集

视频入门

● VideoCapure():获取视频设备/从视频文件中读取视频帧

● cap.read()

返回两个值:第一个为状态值,读到帧为true,第二个值为视频帧动画片一秒24帧

● cap.release()

示例4

import cv2cv2.namedWindow('video',cv2.WINDOW_NORMAL)#获取视频设备
cap=cv2.VideoCapture(0)while True:#从摄像头读取视频帧#cap.read的两个返回值ret,frame=cap.read()#将视频帧在窗口显示cv2.imshow('video',frame)#等待键盘事件#如果设为0,则停在一帧不动了,设短一点,让他循环key=cv2.waitKey(10)if(key& 0xFF==ord('q')):break#释放资源
cap.release()
cv2.destroyAllWindows()

5、 读取视频文件

与视频采集操作类似,只需要修改VideoCapture()和waitKey()参数即可

示例5

import cv2cv2.namedWindow('video',cv2.WINDOW_NORMAL)#获取视频设备/从视频文件中读取视频帧
cap=cv2.VideoCapture("./Video/video_1.mp4")while True:#从摄像头读取视频帧#cap.read的两个返回值ret,frame=cap.read()#将视频帧在窗口显示cv2.imshow('video',frame)#等待键盘事件#如果设为0,则停在一帧不动了,设短一点,让他循环#视频速度与waitKey参数值有关key=cv2.waitKey(40)if(key& 0xFF==ord('q')):break#释放资源
cap.release()
cv2.destroyAllWindows()

为cv.waitKey()使用合适的时间。如果它太小,视频将非常快,如果太大,视频将很慢 (嗯,这就是如何显示慢动作)。正常情况下,25 毫秒就可以了。

6、 视频录制

● VideoWriter

参数一:输出文件参数二:多媒体文件格式(VideoWriter_fourcc)参数三:帧率参数四:分辨率大小(帧的大小)

● write:编码、写文件

● release

示例6


import cv2# 创建videoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
# 须是摄像头真实分辨率1280*720,如果分辨率不一致不会给你写数据
vw = cv2.VideoWriter('./Video/video_2.mp4', fourcc, 25, (1280, 720))cv2.namedWindow('video', cv2.WINDOW_NORMAL)
# 获取视频设备
cap = cv2.VideoCapture(0)#while True:
#判断摄像头是否为打开状态
while cap.isOpened():# 从摄像头读取视频帧# cap.read的两个返回值ret, frame = cap.read()#采集数据时要判断数据是否获取到了if ret==True:# 将视频帧在窗口显示cv2.imshow('video', frame)# 写数据到多媒体文件vw.write(frame)# 等待键盘事件# 如果设为0,则停在一帧不动了,设短一点,让他循环key = cv2.waitKey(10)if (key & 0xFF == ord('q')):breakelse:print("未获取到数据")break# 释放VideoCapture资源
cap.release()
# 释放VideoWriter资源
vw.release()
# 释放窗口
cv2.destroyAllWindows()

代码优化

● 显示窗口为什么变大了?在将要显示的时候再调用一次resizeWindow('video',640,360)● 使用isOpened()判断摄像头是否已打开● 采集数据时要判断数据是否获取到了

7、 鼠标控制

鼠标作为画笔

OpenCV: High-level GUI

设置鼠标回调函数:

● setMouseCallback(winname,callback,userdata)● callback(event,x,y,flags,uesedata)

鼠标回调函数参数:

● event:鼠标移动、按下左键● x,y:鼠标坐标● flags:鼠标键和组合键

示例7


import cv2
import numpy as npdef mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)# 创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)# 设置鼠标回调
cv2.setMouseCallback("mouse", mouse_callback, "123")#随便窗口和背景
img = np.zeros((360, 640, 3), np.uint8)
while True:
cv2.imshow("mouse", img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()

8、 TrackBar控件

作为调色板的跟踪栏

OpenCV: High-level GUI

● createTrackbar

● getTrackbarPos:获得Trackbar当前值

createTrackbar参数:

● trackbarname:控件名,winname:窗口名● value:trackbar当前值● count:最小值为0,最大值为count● callback,userdata

gettrackBarPos参数

● 输入参数:trackbarname● 输入参数:winname● 输出:当前值

示例9

import cv2
import numpy as np# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)def callback():
pass# 创建trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)# 设置背景640*480
img = np.zeros((480, 640, 3), np.uint8)while True:
cv2.imshow('trackbar', img)# 获取当前Trackbar的值
r = cv2.getTrackbarPos('R', 'trackbar')
g = cv2.getTrackbarPos('G', 'trackbar')
b = cv2.getTrackbarPos('B', 'trackbar')# 改变图片颜色
img[:] = [b, g, r]
cv2.imshow('trackbar', img)key = cv2.waitKey(10)
if key & 0xFF == ord('q'):
breakcv2.destroyAllWindows()

http://www.ppmy.cn/news/560813.html

相关文章

相同的网下,mac网速很慢怎么解决

试了下只有这个链接可以解决我的问题 https://blog.csdn.net/PRliu/article/details/53945462?depth_1-utm_sourcedistribute.pc_relevant.none-task&utm_sourcedistribute.pc_relevant.none-task

Centos虚拟机网速太慢,下载太慢

调一下就好了 配置之后网速就会快很多了

JDBC 和数据库连接池

JDBC 和数据库连接池 1. JDBC 概述 1.1 基本介绍 JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。JDBC的基本原理图[重要!]…

电脑网速很快但网页打开很慢

解决办法1:使用360安全卫士DNS优选

pytorch下载过慢

conda install pytorch1.7.1 torchvision0.8.2 torchaudio0.7.2 cudatoolkit10.1 -c pytorch把-c pytorch去掉会下载很快 conda install pytorch1.7.1 torchvision0.8.2 torchaudio0.7.2 cudatoolkit10.1

64位计算机很慢,win7 64位旗舰版电脑网速太慢怎么解决

我想,不管是哪位用户,都希望自己的win7 64位旗舰版下载拥有超高的网速的吧?网速快,咱们播放视频也不会卡了,咱们下载软件程序也会变得很快,咱们搜索一个信息,也会很快的得到结果。但是要想win7旗舰版电脑变…

关于Keil官网下载芯片包的网速很慢的解决办法

打开 Keil官网Pack 1.选择想要下载的芯片包(图1) 图1 2.点击下载,弹出下载项,从下载项右键复制下载网址。在迅雷中新建下载。(图2,3) 图2 图3 5.下好直接安装即可

下载matlab安装包太慢_软件安装不上,可能是网速慢!Conda/R/pip/brew等国内镜像大全拿走不谢~~...

软件安装是生信分析的基础,除了掌握基本的软件安装理论外之后 (Linux - 命令运行监测和软件安装),就是去下载源码安装或使用包管理工具安装。通常操作都没问题时,软件却怎么都装不上,这一般都是网络问题。所以你需要一个能够快速访问的镜像,下载快还不容易断。 Conda镜像 …