zoukankan      html  css  js  c++  java
  • Opencv 学习笔记(二)——三小时精通Opencv(Project)

    参考:2020最新-3h精通Opencv

    代码


    1.颜色识别

    cv2.imread()和cv2.cvtColor() 的使用

    cv2.imread()和cv2.cvtColor() 的使用

    1、cv2.imread()接口读图像,读进来直接是BGR 格式数据格式在 0~255
    需要特别注意的是图片读出来的格式是BGR,不是我们最常见的RGB格式,颜色肯定有区别。
    2、cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式。
    cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
    cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片

    cv2.circle()

    cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
    作用
    根据给定的圆心和半径等画圆
    参数说明
    img:输入的图片data
    center:圆心位置
    radius:圆的半径
    color:圆的颜色
    thickness:圆形轮廓的粗细(如果为正)。负厚度表示要绘制实心圆。
    lineType: 圆边界的类型。
    shift:中心坐标和半径值中的小数位数。

    完整代码:

    import cv2
    import numpy as np
    
    frameWidth = 640
    frameHeight = 480
    cap = cv2.VideoCapture(0)
    #cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    cap.set(3, frameWidth)
    cap.set(4, frameHeight)
    cap.set(10,150)
    
    #添加可以识别的颜色
    myColors = [[5,107,0,19,255,255],
                [133,56,0,159,156,255],
                [57,76,0,100,255,255]]
    myColorValues = [[51,153,255],
                     [255,0,255],
                     [0,255,0]]
    
    
    def findColor(img,myColors,myColorValues):
        imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        count = 0
        for color in myColors:
    
            lower = np.array(color[0:3])  #返回集合中,下标0至3的集合
            upper = np.array(color[3:6])
            mask = cv2.inRange(imgHSV, lower, upper)
    
            x,y = getContours(mask)
    
            cv2.circle(imgResult,(x,y),10,myColorValues[count],cv2.FILLED)
            count += 1
            #cv2.imshow(str(color[0]),mask)
    
    
    def getContours(img):
        contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
        x,y,w,h = 0,0,0,0
        for cnt in contours:
            area = cv2.contourArea(cnt)
            print(area)
            if area>500:
                cv2.drawContours(imgResult,cnt, -1, (255, 0, 0), 3)
                peri = cv2.arcLength(cnt,True)
                approx = cv2.approxPolyDP(cnt,0.02*peri,True)
                x, y, w, h = cv2.boundingRect(approx)
    
        return x+w//2,y
    
    
    while True:
        success, img = cap.read()
        imgResult = img.copy()
    
        findColor(img, myColors, myColorValues)
        cv2.imshow("Result", imgResult)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    

    2.识别+提取 图片内容

    完整代码:

    import cv2
    import numpy as np
    
    
    ###################################
    widthImg=540
    heightImg =640
    #####################################
    
    cap = cv2.VideoCapture(0)
    
    cap.set(10,150)
    
    
    def preProcessing(img):
        imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        imgBlur = cv2.GaussianBlur(imgGray,(5,5),1)
        imgCanny = cv2.Canny(imgBlur,200,200)    #边缘检测
    
        # 给边缘加粗
        kernel = np.ones((5,5))
        imgDial = cv2.dilate(imgCanny,kernel,iterations=2)
        imgThres = cv2.erode(imgDial,kernel,iterations=1)
        return imgThres
    
    def getContours(img):
        biggest = np.array([])
        maxArea = 0
        contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
        for cnt in contours:
            area = cv2.contourArea(cnt)
            if area>5000:
                #cv2.drawContours(imgContour, cnt, -1, (255, 0, 0), 3)
                peri = cv2.arcLength(cnt,True)
                approx = cv2.approxPolyDP(cnt,0.02*peri,True)     #计算边数
                if area >maxArea and len(approx) == 4:
                    biggest = approx
                    maxArea = area
        cv2.drawContours(imgContour, biggest, -1, (255, 0, 0), 20)
        return biggest
    
    def reorder (myPoints):
        myPoints = myPoints.reshape((4,2))
        myPointsNew = np.zeros((4,1,2),np.int32)
        add = myPoints.sum(1)
        #print("add", add)
        myPointsNew[0] = myPoints[np.argmin(add)]
        myPointsNew[3] = myPoints[np.argmax(add)]
        diff = np.diff(myPoints,axis=1)
        myPointsNew[1]= myPoints[np.argmin(diff)]
        myPointsNew[2] = myPoints[np.argmax(diff)]
        #print("NewPoints",myPointsNew)
        return myPointsNew
    
    def getWarp(img,biggest):
        biggest = reorder(biggest)
        pts1 = np.float32(biggest)    # 获取最大轮廓
        pts2 = np.float32([[0, 0], [widthImg, 0], [0, heightImg], [widthImg, heightImg]])
        matrix = cv2.getPerspectiveTransform(pts1, pts2)
        imgOutput = cv2.warpPerspective(img, matrix, (widthImg, heightImg))
    
        imgCropped = imgOutput[20:imgOutput.shape[0]-20,20:imgOutput.shape[1]-20]
        imgCropped = cv2.resize(imgCropped,(widthImg,heightImg))
    
        return imgCropped
    
    
    def stackImages(scale,imgArray):
        rows = len(imgArray)
        cols = len(imgArray[0])
        rowsAvailable = isinstance(imgArray[0], list)
        width = imgArray[0][0].shape[1]
        height = imgArray[0][0].shape[0]
        if rowsAvailable:
            for x in range ( 0, rows):
                for y in range(0, cols):
                    if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:
                        imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
                    else:
                        imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)
                    if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)
            imageBlank = np.zeros((height, width, 3), np.uint8)
            hor = [imageBlank]*rows
            hor_con = [imageBlank]*rows
            for x in range(0, rows):
                hor[x] = np.hstack(imgArray[x])
            ver = np.vstack(hor)
        else:
            for x in range(0, rows):
                if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
                    imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
                else:
                    imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
                if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
            hor= np.hstack(imgArray)
            ver = hor
        return ver
    
    while True:
        #success, img = cap.read()
        #使用摄像头
        #img = cv2.resize(img,(widthImg,heightImg))
    
        #使用图片
        img = cv2.imread("Resources/paper.jpg")
        imgContour = img.copy()
    
        imgThres = preProcessing(img)
        biggest = getContours(imgThres)
        if biggest.size !=0:
            imgWarped=getWarp(img,biggest)
            # imageArray = ([img,imgThres],
            #           [imgContour,imgWarped])
            imageArray = ([imgContour, imgWarped])
            cv2.imshow("ImageWarped", imgWarped)
        else:
            # imageArray = ([img, imgThres],
            #               [img, img])
            imageArray = ([imgContour, img])
    
        stackedImages = stackImages(0.6,imageArray)
        cv2.imshow("WorkFlow", stackedImages)
    
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
  • 相关阅读:
    jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解
    jQuery 源码解析(二十三) DOM操作模块 替换元素 详解
    jQuery 源码解析(二十二) DOM操作模块 复制元素 详解
    jQuery 源码分析(二十一) DOM操作模块 删除元素 详解
    jQuery 源码分析(二十) DOM操作模块 插入元素 详解
    jQuery 源码分析(十九) DOM遍历模块详解
    python 简单工厂模式
    python 爬虫-协程 采集博客园
    vue 自定义image组件
    微信小程序 image组件坑
  • 原文地址:https://www.cnblogs.com/Charon97/p/13657356.html
Copyright © 2011-2022 走看看