• OpenCV 初体验


    个人博客原文链接
    个人掘金链接

    本文简单地介绍计算机图形处理的一些基本概念,以及一些有趣的例子和对应的Open CV的代码操作。

    顺便说一句,恭喜IG夺冠!

    一、图片存储原理

    1、颜色空间RGB

    (1)RGB三通道彩色图

    图片由三维矩阵叠加而成([0,255]),通俗讲就是将三个分别只有R(red),G(green),B(blue)的矩阵叠加。

    三维矩阵

    2、图像处理

    (1)卷积/滤波

    二、OpenCV基础

    Open CV是一个开源的计算机视觉库,采用C/C++编写,提供Python、MATLAB以及其他语言的接口。

    1、基本I/O操作

    #-*- coding: utf-8 -*-
    import cv2
    
    # 打开图片
    img = cv2.imread('lion.jpg')
    
    # 显示图片
    img = cv2.imshow('lion','lion.jpg')
    
    # 保存图片
    cv2.imwrite('lion2.jpg',img)
    
    

    2、灰度、二值化处理

    灰度化:在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色。

    二值化:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,整个图像呈现出明显的只有黑和白的视觉效果

    #-*- coding: utf-8 -*-
    import cv2  
    
    # 读取图片
    img = cv2.imread('wsc.jpeg')
    
    # 灰度化处理、保存处理后文件
    img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imwrite('wsc-gray.jpg',img)
    
    # 二值化处理、保存处理后文件
    cv2.threshold(image, 550, 550, 0, image) 
    cv2.imwrite('wsc-two-value.jpg',img)
    
    
    图片处理前 灰度处理
    wsc图片处理前 wsc图片处理前
    图片处理前 二值处理
    wsc图片处理前 wsc图片处理后

    3、图片匹配

    matchTemplate用于在图像中与模板图片比对,查找目标

    cv2.matchTemplate(img,template,eval('cv2.TM_CCOEFF'))
    
    

    关键参数

    • TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。

    • TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。

    • TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。

    • TM_SQDIFF_NORMED 归一化平方差匹配法      

    • TM_CCORR_NORMED 归一化相关匹配法      

    • TM_CCOEFF_NORMED 归一化相关系数匹配法

    三、有趣的例子

    1、边缘检测

    Canny边缘检测

    代码

    #-*- coding: utf-8 -*-
    import cv2
    
    # 读取图片
    img = cv2.imread('wsc.jpeg')
    
    # Canny边缘检测处理,并写入图片
    cv2.imwrite('wsc1.jpeg',cv2.Canny(img,200,300))
    
    
    
    图片处理前 图片处理后
    wsc图片处理前 wsc图片处理后

    2、人脸检测

    haarcascade_frontalface_default.xml,该文件为人脸检测器(默认)文件,文件可在OpenCV的Github上下载。

    #-*- coding: utf-8 -*-
    import cv2
    
    def detect(filename):
    
        face_cascade = cv2.CascadeClassifier('./data/haarcascades/haarcascade_frontalface_default.xml')
    
        # 读取图片
        img = cv2.imread(filename)
    
        # 图片灰度处理
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
        # 人脸检测,每次迭代图像压缩率、人脸矩形保留近邻数目最小值
        faces = face_cascade.detectMultiScale(gray,1.3,6)
    
        # x,y为左上角坐标,w,h表示人脸宽度和高度
        for(x,y,w,h) in faces:
            # 检测到人脸绘制成蓝色矩形
            img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    
        # 写入文件
        cv2.imwrite('/Users/fangzhijie/Pictures/ig1.jpeg',img)
    
    filename = 'ig.jpeg'
    detect(filename)
    
    
    图片处理前
    wsc图片处理前
    图片处理后
    wsc图片处理前

    剩下的三位没有识别出来,待定位原因。

    3、图像匹配

    搜索模板图片

    模板图片

    原图

    IG原图

    代码

    
    # -*- coding: utf-8 -*-
    
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    # 读取图片
    img = cv2.imread('ig.jpeg')
    template = cv2.imread('wsc123.png')
    # 对图片进行缩放,缩放到合适大小90*90
    template = cv2.resize(template, (90, 90),interpolation=cv2.INTER_CUBIC)
    
    # 进行图像匹配
    res = cv2.matchTemplate(img,template,eval('cv2.TM_CCOEFF'))
    
    # 记录模板的宽度和高度
    w, h = template[:,:,0].shape[::-1]
    
    # 王思聪边框的具体位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    
    # 画出红框
    top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    imgplt = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    cv2.rectangle(imgplt,top_left, bottom_right, 255, 2)
    
    # 显示图片
    plt.imshow(imgplt)
    plt.title('Detected results'), plt.xticks([]), plt.yticks([])
    plt.show()
    
    

    结果

    处理结果

    参考文档

    《OpenCV 3计算机视觉》

  • 相关阅读:
    C#基础第五天-作业-用DataTable制作名片集
    C#基础第四天-作业答案-Hashtable-list<KeyValuePair>泛型实现名片
    C#基础第四天-作业-Hashtable-list<KeyValuePair>泛型实现名片
    C#基础第三天-作业答案-集合-冒泡排序-模拟名片
    C#基础第三天-作业-集合-冒泡排序-模拟名片
    C#基础第二天-作业答案-九九乘法表-打印星星
    C#基础第二天-作业-九九乘法表-打印星星
    C#基础第一天-作业答案
    C#基础第一天-作业
    C#-string.Format对C#字符串格式化
  • 原文地址:https://www.cnblogs.com/fonxian/p/10329051.html
Copyright © 2020-2023  润新知