Opencv中的图片与视频

关于图片

  • 读取图像
    cv.imread()
    
    读取图像,函数的第一个参数为图片的路径,第二个参数是用于指定图片读取方式的标志。
    • cv.IMREAD_COLOR加载彩色图像。图像的任何透明度都将被忽略
    • cv.IMREAD_GRAYSCALE灰度模式下加载图像
    • cv.IMREAD_UNCHANGED加载包括alpha通道的图像
    • 除了这些标志,还可以传递1,0,-1
  • 显示图像
    cv.imshow()
    
    在窗口中显示图像,窗口自动适合图像尺寸,函数的第一个参数是窗口名称,它是一个字符串,第二个参数是加载的图像,可以创建任意数量的窗口,要求不能使用同样的窗口名
    import cv2 as cv
    
    img = cv.imread('C:\\work_test\\1.jpg', 0)
    cv.imshow('image', img)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    
    cv.waitKey()是键盘绑定功能。参数是时间(以毫秒为单位),该函数将为任何键盘事件等待指定的毫秒数。如果在此期间按任意键,程序将继续。如果传递 0,它将无限期地等待击键,除此之外还可以将其设置为检测特定的按键。
    cv.destroyAllWindows()会破坏创建的所有窗口,如果要销毁任何特定的窗口,需要使用函数 cv.destroyWindow()在其中传递确切的窗口名称作为参数。
    cv.namedWindow()可以设置窗口的大小,默认情况下,该标志为cv.WINDOW_AUTOSIZE,自适应创建的窗口不可以调整大小,将flag指定为cv.WINDOW_NORMAL,即可调整窗口大小。
    import cv2 as cv
    
    img = cv.imread('C:\\work_test\\1.jpg', 0)
    cv.namedWindow('image',cv.WINDOW_NORMAL)
    cv.imshow('image', img)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    
    在图片读取不到的情况下,在显示时会报错,error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow',需检查文件路径。
  • 保存图像
    cv.imwrite()
    
    保存图像,第一个参数是文件名,第二个参数是要保存的图片
    import cv2 as cv
    
    img = cv.imread('C:\\work_test\\1.jpg', 0)
    cv.namedWindow('image', cv.WINDOW_NORMAL)
    cv.imshow('image', img)
    keyw = cv.waitKey(0)
    if keyw == 27:
        cv.destroyAllWindows()
    elif keyw == ord('s'):
        cv.imwrite('new_1.jpg', img)
        cv.destroyAllWindows()
    
    
    加载图像并显示它,如果按“ s”即可保存该图像至工作目录下,然后退出,如果按ESC键只是退出而不保存即可。

关于视频

  • 捕获摄像机视频或从文件播放视频
    cv.VideoCapture()
    当参数为设备索引时,用来指定摄像机的标号,可以捕获摄像机视频;当参数为视频文件名称时,则是从文件播放视频
    • 捕获摄像机视频
      import cv2 as cv
      
      cap = cv.VideoCapture(0)
      if not cap.isOpened():
          print("Cannot open camera")
          exit()
      while True:
          ret, frame = cap.read()
          if not ret:
              print("Can't receive frame, Exiting ...")
              break
          gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
          cv.imshow('frame', gray)
          if cv.waitKey(1) == ord('q'):
              break
      cap.release()
      cv.destroyAllWindows()
      
      
      cap.read()会返回一个布尔值,可以通过这个布尔值来判断是否正确读取到帧在这里插入图片描述
      使用cap.get()可以访问视频的某些属性,参数是0-18的数字,每个数字表示视频的一个属性,还可以通过cat.set()对属性值修改,如修改视频分辨率
      import cv2 as cv
      
      cap = cv.VideoCapture(0)
      if not cap.isOpened():
          print("Cannot open camera")
          exit()
      print("默认值:")
      print(cap.get(cv.CAP_PROP_FRAME_WIDTH))
      print(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
      cap.set(cv.CAP_PROP_FRAME_WIDTH,160)
      cap.set(cv.CAP_PROP_FRAME_HEIGHT,120)
      print("修改后的值:")
      print(cap.get(cv.CAP_PROP_FRAME_WIDTH))
      print(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
      while True:
          ret, frame = cap.read()
          if not ret:
              print("Can't receive frame, Exiting ...")
              break
          gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
          cv.imshow('frame', gray)
          if cv.waitKey(1) == ord('q'):
              break
      cap.release()
      cv.destroyAllWindows()
      
      
      运行结果为:
      默认值:
      640.0
      480.0
      修改后的值:
      160.0
      120.0
      
    • 从文件播放视频
      只需将cv.VideoCapture()参数改为视频文件路径即可
      import cv2 as cv
      
      cap = cv.VideoCapture('C:\\work_test\\vedio.mp4')
      if not cap.isOpened():
          print("Cannot open file")
          exit()
      while True:
          ret, frame = cap.read()
          if not ret:
              print("Can't receive frame, Exiting ...")
              break
          gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
          cv.imshow('frame', gray)
          if cv.waitKey(25) == ord('q'):
              break
      cap.release()
      cv.destroyAllWindows()
      
      
      cv.waitKey()参数设置小时,视频播放会特别快,设置大时会变慢。
  • 保存视频
    cv.VideoWriter()
    
    保存视频,函数需要指定输出文件名,指定fourcc代码,fourcc是一个4字节的代码,用于指定视频编码器,MJPG(.mp4),DIVX(.avi),X264(.mkv),指定每秒的帧数和帧大小。
    import cv2 as cv
    
    cap = cv.VideoCapture(0)
    fourcc = cv.VideoWriter_fourcc(*'DIVX')
    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)
        out.write(frame)
        cv.imshow('frame', frame)
        if cv.waitKey(1) == ord('q'):
            break
    cap.release()
    out.release()
    cv.destroyAllWindows()
    
    
    cv.flip()是对视频进行旋转,0表示视频绕X轴旋转,大于0为视频绕Y轴旋转,小于0为绕X和Y轴进行旋转
发布了80 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/C_abua/article/details/102592515