教程

图片加载和展示

  • 读取图片和展示
    src = cv.imread("C:/Users/cznczai/Desktop/Important_file/person1.jpg") 加载
    
    def get_image_info(image):
      print(image.shape)
      print(image.size)
      print(type(image))
      print(image.dtype)
    #(413, 295, 3) 高度 宽度 通道3个
    #365505  413*295*3
    #<class 'numpy.ndarray'>; n维数组形式
    #uint8 无符号的8位
    
    get_image_info(src)
    cv.namedWindow("image",cv.WINDOW_AUTOSIZE)
    cv.imshow("image",src)
    cv.waitKey(0) # ≤ 0,将无限期的等待下去;当delay=0时,就是等待delay毫秒
    cv.destroyAllWindows()//关闭所有的窗口
  • 图片转化为灰度图片 并且保存到本地的代码

    src = cv.imread("C:/Users/cznczai/Desktop/Lena.jpg")
    cv.namedWindow("image",cv.WINDOW_AUTOSIZE)
    cv.imshow("image",src)
    gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
    cv.imwrite("C:/Users/cznczai/Desktop/Lena_gray.jpg",gray)
    cv.waitKey(0)
    cv.destroyAllWindows()
  • 输入输出高度宽度通道数
    def show_info(image):
        heigh = image.shape[0]
        width = image.shape[1]
        channel = image.shape[2]
        #heigh:200,width=200,channel=3
        print("heigh:%s,width=%s,channel=%s"%(heigh,width,channel))
  • 遍历所有的像素点 进行修改后展示
    def show_info(image):
        heigh = image.shape[0]
        width = image.shape[1]
        channel = image.shape[2]
        print("heigh:%s,width=%s,channel=%s"%(heigh,width,channel))
        for i in range(heigh):
            for j in range(width):
                for z in range(channel):
                    temp = image[i,j,z]
                    image[i,j,z] =  130- temp
        cv.imshow("image",image)
    
    src = cv.imread("C:/Users/cznczai/Desktop/Lena.jpg")
    show_info(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
       
      也可以用于 遍历换证件照   【后面会用算法进行优化】
      
  • 也可以用numpy生成的一个三维数组 作为一个图片 如果全0为黑色
    def show_info(image):
        heigh = image.shape[0]
        width = image.shape[1]
        channel = image.shape[2]    
        print(image[0,0])
        create_image = np.zeros([heigh,width,channel],np.uint8) #黑色
        create_image[:,:,:] = 255  # 白色
    
        create_image2 = np.ones([heigh,width,channel],np.uint8)*127 #灰色
        print(create_image2)
        cv.imshow("image",create_image2)
    通过 reshape(1,9) 可以重构
    def show_info(image):
        arr = np.ones([3,3],np.uint8)
        arr.fill(111)
        print(arr)
        arr2 = arr.reshape([1,9])
        print(arr2)
    [[111 111 111]
     [111 111 111]
     [111 111 111]]
    [[111 111 111 111 111 111 111 111 111]]

     

视频部分

  • 打开视频并且详细代码注解

    def video_demo():
      capture = cv.VideoCapture(0) # VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如cap = cv2.VideoCapture(“../test.avi”) while(True):
          ret ,frame = capture.read()
          frame = cv.flip(frame,1)  #投影镜像对称
          cv.imshow("video",frame)
          c = cv.waitKey(10) # 每个10ms刷新一次 if c != 27: #返回值为k毫秒内键盘按键的ASCII码值 break;  # esc键对应的ASCII码是27,即当按esc键是if条件句成立 video_demo()
    cv.destroyAllWindows()

色彩空间


  1. 颜色反转 ,我们可以通过每个像素点用255去减 但是效率太慢了  cv中有反转颜色的方法供我们调用
    def show_info(image):
        image = cv.bitwise_not(image)
        cv.imshow("image",image)

  2.  cv库还有一些rgb->其他类型的像色
    def show_info(image):
        cv.imshow("rgb",image)
        yuv = cv.cvtColor(image,cv.COLOR_BGR2YUV)
        cv.imshow("yuv",yuv)
        ycrcb = cv.cvtColor(image,cv.COLOR_BGR2YCrCb)
        cv.imshow("ycrcb",ycrcb)
           
          H(0-180) : S(0-255) : V(0-255)
        
  • 用hsv进行识别  分别用视频跟图片进行展示  我们可以参照上面的表 选址目标范围 然后opencv会对图像进行识别【可以对颜色进行跟踪 通过上面的表进行套用】
    def show_info(image):
        hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
        hsv_min = np.array([100,43,46])
        hsv_max = np.array([124,255,255])
        mark = cv.inRange(hsv,hsv_min,hsv_max) # mark就是黑白图片
        cv.imshow("mark",mark)
      

  • 利用通道进行 rgb 三个通道的值的获取
    src = cv.imread("C:/Users/cznczai/Desktop/person1.jpg")
    b , g , r = cv.split(src)
    print(b)
    print(g)
    print(r)
    image = cv.merge([g,b,r])#cv.merge([b,g,r])
    cv.imshow("image",image)
    cv.waitKey(0)
    cv.destroyAllWindows()


图形的四则运算

  1. 加减乘除
    def divi(image1 , image2):
        dst =  cv.divide(image1 , image2)
        cv.imshow("diviv",dst)
        
    def mul(image1 , image2):
        dst =  cv.multiply(image1 , image2)
        cv.imshow("multiply",dst)    
    
    def add(image1 , image2):
        dst =  cv.add(image1 , image2)
        cv.imshow("add",dst)
        
    def subtract(image1 , image2):
        dst =  cv.subtract(image1 , image2)
        cv.imshow("subtract",dst)
      
      对于图片一些边角有毛那种 是因为图片附近不是绝对为白色 伪白色那种 放大那种马赛克 导致的,相乘将这种效果更加明显

  1.   还可以对图片求方差和平均值 , 有时候可以用方差或者平均值来判断图像是否有效
    def mean(image1,image2):
        print(cv.mean(image1))
        print(cv.mean(image2))
    
    def dev(image1,image2):
        print(cv.meanStdDev(image1))
        print(cv.meanStdDev(image2))


逻辑运算
  •  可以用运算符灵活处理图片 
    def logic_and(image1,image2):过滤 白色的留下 黑色全为黑色
        and_image = cv.bitwise_and(image1,image2)
        cv.imshow("and",and_image)
        
    def logic_or(image1,image2): 叠加
        and_image = cv.bitwise_or(image1,image2)
        cv.imshow("or",and_image)
    
    def logic_nor(image1,image2)://否
       and_image = cv.bitwise_not(image2)
        cv.imshow("nor",and_image)
     
  • 也可以处理视频
    def show_video():
        capture = cv.VideoCapture("C:/Users/cznczai/Desktop/111.mp4")
        while(True):
            ret,frame = capture.read()
            if ret == False:
                break
    
            hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
            hsv_min = np.array([100,43,46])
            hsv_max = np.array([124,255,255])
            mask = cv.inRange(hsv,hsv_min,hsv_max)
            dst = cv.bitwise_and(frame,frame,mask=mask)
            cv.imshow("v",dst)
            c = cv.waitKey(40)
            if c == 27:
                break
    show_video()
    cv.waitKey(0)
    cv.destroyAllWindows()