欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

opencv對多種顏色小球的形狀及位置判斷方式

 更新時(shí)間:2022年11月10日 10:57:05   作者:a魚兒哥  
在這段時(shí)間參加了一個(gè)競賽,寫下了這個(gè)代碼,但是總感覺有一些地方是不完善!這是一個(gè)關(guān)于使用opencv庫判斷顏色小球形狀及位置的功能實(shí)現(xiàn),其中也參考了一些前輩的代碼,希望能對迷茫中的小伙幫有所幫助

一、opencv是什么?

OpenCV是一個(gè)用于圖像處理、分析、機(jī)器視覺方面的開源函數(shù)庫.

二、使用步驟

1.引入庫

代碼如下:

import cv2
import numpy as np

2.設(shè)置顏色閾值

代碼如下:

#顏色閾值
low_red = np.array([100, 100, 60])
up_red = np.array([180, 255, 255])
low_green = np.array([35, 43, 46])
up_green = np.array([77, 255, 255])
low_blue = np.array([90, 110, 110])
up_blue = np.array([124, 255, 255])
#記錄形狀
xz = {}

字典xz是待會記錄形狀用的

3.對圖片進(jìn)行加載和處理

代碼如下:

if __name__ == '__main__':
    image = cv2.imread('img_1.png')#讀取圖像
    image = cv2.resize(image, (500, 500))#重新裁剪圖像
    #image = cv2.GaussianBlur(image, (11, 11), 0)#高斯濾波
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    color_read(hsv, image)#處理圖片的函數(shù)
    cv2.imshow('image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

4.處理圖片的函數(shù)

代碼如下:

def color_read(hsv, image):
    global xz
    blue = get_image(hsv, low_blue, up_blue)#使用獲取顏色空間的函數(shù)進(jìn)行顏色獲取三種顏色
    red = get_image(hsv, low_red, up_red)
    green = get_image(hsv, low_green, up_green)
    mask = blue + red + green
    #尋找圖像的輪廓
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
    print('cnts:', len(cnts))
    ##先判斷形狀再畫輪廓
    for cnt in cnts:
        area = cv2.contourArea(cnt)#計(jì)算輪廓的面積
        print('area:', area)
        if area > 1000:
            epsilon = 0.04 * cv2.arcLength(cnt, True)#計(jì)算輪廓長度
            approx = cv2.approxPolyDP(cnt, epsilon, True)#計(jì)算輪廓角點(diǎn)
            corners = len(approx)
            print(corners)
            #根據(jù)角點(diǎn)的個(gè)數(shù)判斷形狀
            if corners == 3:
                a = '三角形'
                b = approx[0][0][0]  # 根據(jù)三角形的角點(diǎn)判斷位置
                xz[a] = b
                area, trgl = cv2.minEnclosingTriangle(cnt)#尋找三角形的輪廓
                # 繪制三角形輪廓
                for i in range(0, 3):
                    cv2.line(image, tuple(trgl[i][0]), tuple(trgl[(i + 1) % 3][0]), (0, 255, 0), 2)
            elif corners == 4:
                a = '矩形'
                b = approx[0][0][0]
                xz[a] = b
                x, y, w, h = cv2.boundingRect(cnt)#尋找矩形輪廓
                cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)#繪制矩形輪廓
                
            else:
            	#圓形這里是處理的不好的地方所以我沒有用變量x1和z,因?yàn)楫嫵鰜淼妮喞悬c(diǎn)大
                a = '圓'
                b = approx[0][0][0]
                xz[a] = b
                ((x1, y1), z) = cv2.minEnclosingCircle(cnt)#尋找圓形輪廓
                x1 = int(x1)
                y1 = int(y1)
                z = int(z)
                cv2.circle(image, (150, y1), 60, (0, 255, 0), 2)#繪制圓形輪廓

5.獲取顏色空間函數(shù)

代碼如下:

#獲取圖像hsv的方法
def get_image(hsv, low, up):
    mask = cv2.inRange(hsv, low, up)#獲取色彩空間
    mask = cv2.erode(mask, None, 2)#腐蝕操作
    mask = cv2.dilate(mask, None, 2)#膨脹操作
    return mask

6.運(yùn)行效果

在這里插入圖片描述

在這里插入圖片描述

圖片之前拍的不是很好所以我截成了小圖,圖片拍的是幾何圖所以效果不太好,如果是平面的可能會好一點(diǎn),圖二是打印字典xz的輸出。

7.完整代碼

#獲取圖像hsv的方法
import cv2
import numpy as np
#顏色閾值
low_red = np.array([100, 100, 60])
up_red = np.array([180, 255, 255])
low_green = np.array([35, 43, 46])
up_green = np.array([77, 255, 255])
low_blue = np.array([90, 110, 110])
up_blue = np.array([124, 255, 255])
#記錄形狀
xz = {}

#獲取圖像hsv的方法
def get_image(hsv, low, up):
    mask = cv2.inRange(hsv, low, up)#獲取色彩空間
    mask = cv2.erode(mask, None, 2)#腐蝕操作
    mask = cv2.dilate(mask, None, 2)#膨脹操作
    return mask

#獲取輪廓
def color_read(hsv, image):
    global xz
    blue = get_image(hsv, low_blue, up_blue)#使用獲取顏色空間的函數(shù)進(jìn)行顏色獲取三種顏色
    red = get_image(hsv, low_red, up_red)
    green = get_image(hsv, low_green, up_green)
    mask = blue + red + green
    #尋找圖像的輪廓
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
    print('cnts:', len(cnts))
    ##先判斷形狀再畫輪廓
    for cnt in cnts:
        area = cv2.contourArea(cnt)#計(jì)算輪廓的面積
        print('area:', area)
        if area > 1000:
            epsilon = 0.04 * cv2.arcLength(cnt, True)#計(jì)算輪廓長度
            approx = cv2.approxPolyDP(cnt, epsilon, True)#計(jì)算輪廓角點(diǎn)
            corners = len(approx)
            print(corners)
            #根據(jù)角點(diǎn)的個(gè)數(shù)判斷形狀
            if corners == 3:
                a = '三角形'
                b = approx[0][0][0]  # 根據(jù)三角形的角點(diǎn)判斷位置
                xz[a] = b
                area, trgl = cv2.minEnclosingTriangle(cnt)#尋找三角形的輪廓
                # 繪制三角形輪廓
                for i in range(0, 3):
                    cv2.line(image, tuple(trgl[i][0]), tuple(trgl[(i + 1) % 3][0]), (0, 255, 0), 2)
            elif corners == 4:
                a = '矩形'
                b = approx[0][0][0]
                xz[a] = b
                x, y, w, h = cv2.boundingRect(cnt)#尋找矩形輪廓
                cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)#繪制矩形輪廓

            else:
                a = '圓'
                b = approx[0][0][0]
                xz[a] = b
                ((x1, y1), z) = cv2.minEnclosingCircle(cnt)#尋找圓形輪廓
                x1 = int(x1)
                y1 = int(y1)
                z = int(z)
                cv2.circle(image, (150, y1), 60, (0, 255, 0), 2)#繪制圓形輪廓


if __name__ == '__main__':
    image = cv2.imread('img_1.png')#讀取圖像
    image = cv2.resize(image, (500, 500))#重新裁剪圖像
    #image = cv2.GaussianBlur(image, (11, 11), 0)#高斯濾波
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    color_read(hsv, image)#處理圖片的函數(shù)
    cv2.imshow('image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    #對拿到的小球字典位置數(shù)據(jù)進(jìn)行處理
    xz[min(xz, key=xz.get)] = 1
    xz[max(xz, key=xz.get)] = 3
    xz[max(xz, key=xz.get)] = 2
    xz = sorted(xz.items(), key=lambda x: x[1], reverse=False)
    xz = dict(xz)

    print(xz)

總結(jié)

這是這個(gè)代碼的詳細(xì)和功能介紹,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)針對給定字符串尋找最長非重復(fù)子串的方法

    Python實(shí)現(xiàn)針對給定字符串尋找最長非重復(fù)子串的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)針對給定字符串尋找最長非重復(fù)子串的方法,涉及Python針對字符串的遍歷、排序、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • kali中python版本的切換方法

    kali中python版本的切換方法

    今天小編就為大家分享一篇kali中python版本的切換方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • tensorflow 重置/清除計(jì)算圖的實(shí)現(xiàn)

    tensorflow 重置/清除計(jì)算圖的實(shí)現(xiàn)

    今天小編就為大家分享一篇tensorflow 重置/清除計(jì)算圖的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • pip版本低引發(fā)的python離線包安裝失敗的問題

    pip版本低引發(fā)的python離線包安裝失敗的問題

    這篇文章主要介紹了pip版本低引發(fā)的python離線包安裝失敗的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python正則表達(dá)式re模塊的使用示例詳解

    python正則表達(dá)式re模塊的使用示例詳解

    這篇文章主要為大家介紹了python正則表達(dá)式re模塊的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • python3實(shí)現(xiàn)UDP協(xié)議的服務(wù)器和客戶端

    python3實(shí)現(xiàn)UDP協(xié)議的服務(wù)器和客戶端

    這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)UDP協(xié)議的服務(wù)器和客戶端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Python與C語言分別解決完全平方數(shù)問題

    Python與C語言分別解決完全平方數(shù)問題

    完全平方數(shù)指用一個(gè)整數(shù)乘以自己例如1*1.2*2.3*3等依次類推,若一個(gè)數(shù)能表示成某個(gè)整數(shù)的平方的形式,則稱這個(gè)數(shù)為完全平方數(shù)。完全平方數(shù)是非負(fù)數(shù),而一個(gè)完全平方數(shù)的項(xiàng)有倆個(gè),讓我們用程序來練習(xí)一下
    2022-03-03
  • Python+Pygame編寫一個(gè)Pong游戲

    Python+Pygame編寫一個(gè)Pong游戲

    Pong游戲模擬了兩個(gè)打乒乓球的人,就是在兩條線中間有一個(gè)點(diǎn)在動,操縱器就是一個(gè)搖桿上有一個(gè)按鈕的那種。本文就來用Python中的Pygame庫編寫一個(gè)Pong小游戲
    2023-01-01
  • 升級keras解決load_weights()中的未定義skip_mismatch關(guān)鍵字問題

    升級keras解決load_weights()中的未定義skip_mismatch關(guān)鍵字問題

    這篇文章主要介紹了升級keras解決load_weights()中的未定義skip_mismatch關(guān)鍵字問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python 獲取微信好友列表的方法(微信web)

    python 獲取微信好友列表的方法(微信web)

    今天小編就為大家分享一篇python 獲取微信好友列表的方法(微信web),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02

最新評論