一些基本操作
读取摄像头:
import cv2 as cv
if __name__ == '__main__':
cap = cv.VideoCapture(0) #一般电脑内置摄像头为0,你可以通过设置成 1 或者其他的来选择别的摄像头
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# Our operations on the frame come here
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)#你也可以注释掉这行颜色转换的代码
# Display the resulting frame
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()
保存视频:
import cv2 as cv
if __name__ == '__main__':
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
frame = cv.flip(frame, 0)
# write the flipped frame
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()
保存一个avi后缀的文件可以复制,粘贴到文件夹再打开
画圆
要画圆的话,只需要指定圆形的中心点坐标和半径大小。我们在上面的矩 形中画一个圆; cv.circle()
cv.circle(img,(447,63), 63, (0,0,255), -1)
思考题:
- Opencv库与Matlab、halcon的区别?
简介:
MATLAB(矩阵实验室)是MATrixLABoratory的缩写,bai是一款由美国The MathWorks公司出品的商业数学软件。MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。除了矩阵运算、绘制函数/数据图像等常用功能外,MATLAB还可以用来创建用户界面及与调用其它语言(包括C,C++,Java,Python和FORTRAN)编写的程序。
MATLAB的主要提供以下功能[6]:
可用于技术计算的高级语言
可对代码、文件和数据进行管理的开发环境
可以按迭代的方式探查、设计及求解问题的交互式工具
可用于线性代数、统计、傅立叶分析、筛选、优化以及数值积分等的数学函数
可用于可视化数据的二维和三维图形函数
可用于构建自定义的图形用户界面的各种工具
可将基于MATLAB的算法与外部应用程序和语言(如C、C++、Fortran、Java、COM以及Microsoft Excel)集成的各种函数
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持
HALCON机器视觉软件
HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境。它节约了产品成本,缩短了软件开发周期——HALCON灵活的架构便于机器视觉,医学图像和图像分析应用的快速开发。在欧洲以及日本的工业界已经是公认具有最佳效能的Machine Vision软件。
halcon以前没有听说过,但既然词条说是“机器视觉软件",应用领域跟opencv肯定不同。有人说OpenCV侧重计算机视觉领域,侧重研究领域;Halcon侧重机器视觉领域,侧重应用领域。
个人认为metlab多用于数学领域,像统计方面的,还有回执图表或者一些模拟图,对于图像处理应该不多。
为什么是import cv2?
cv2是一个模块,cv2中的‘2’代表的不是OpenCV的版本,OpenCV是基于C/C++的,”cv”表示底层使用的是C API,”cv2”表示使用的是C++API
在显示完之后,用不用cv.destroyWindow()有什么区别?
我认为可能cv.destroyWindow()要和cv.waitkey(5000)这样的配合使用才有区别,试了一下如果写cv.waitkey(),点击任意按钮后窗口也会自动关闭,好像加不加cv.destroyWindow()并没有影响
cv.destroyWindow()用来关闭指定窗口 ,DestroyWindow函数可以把窗口清除,然后自动调用WM_DESTROY消息,从而调用PostQuitMessage,送出MW_QUIT信息,这样的话就会结束信息循环,就会结束整个的应用程序。
png图片格式和jpg图片格式有什么区别?
jpg格式的图片随着压缩比的增大,图片的品质会逐渐降低。而png图片体积小,节约空间,与jpg图片相比,png图片是无损压缩,在不损失图片数据的情况下,可以快速的获取自己想要的图片,而且图片的质量并不会下降。
总得来说感觉就是png大概占用空间更小,图片质量更高,
练习题:
同时显示两张不同分辨率的图片,对比他们的大小;
搜了一下不同分辨率的图片:
其实没看出来区别。
使用Opencv,测试一下你电脑摄像头的分辨率和帧率是多少;
先记录一个读取帧数的代码:
(用opencv内带的计数器)
import cv2
video_cap = cv2.VideoCapture('nice.mp4')
frame_count = 0
all_frames = []
frame_count = 0
all_frames = []
NUM = video_cap.get(cv2.CAP_PROP_FRAME_COUNT)
print("test:",NUM)
结果:
我发现用avi文件读取出来的帧数恒为0 ,只有mp4文件格式才能读取。
帧率读取:
import cv2
video = cv2.VideoCapture(0)
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
if int(major_ver) < 3:
fps = video.get(cv2.cv.CV_CAP_PROP_FPS)
print("Frames per second using video.get(cv2.cv.CV_CAP_PROP_FPS): {0}".format(fps))
else:
fps = video.get(cv2.CAP_PROP_FPS)
print("Frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps))
video.release()
结果:
Frames per second using video.get(cv2.CAP_PROP_FPS) : 30.0
利用电脑摄像头从外界拍摄一幅自己的图像,添加圆(或其他图形)给自己打码,图片右下角添加自己的网名和时间。
用之前在图书馆的照片吧。代码:
import cv2
img = cv2.imread("me2.jpg")
cv2.circle(img,(59,200),50, (0,0,255), -1)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'code 2021-02-06',(10,650), font, 1,(255,255,255),2,cv2.LINE_AA)
cv2.imshow("me",img)
cv2.waitKey()