opencv基本了解、图像读取和绘图

一些基本操作

读取摄像头:

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()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41358574/article/details/113700026