訂閱
糾錯
加入自媒體

車位數量檢測

2023-05-05 10:50
磐創AI
關注

該項目基于圖像處理來檢測停車場中的空間。

該項目將使用 openCV 和 CVzone 庫來執行圖像處理任務。

如何運行

用鼠標單擊功能在停車場的靜止圖像上繪制框在這些單獨的框上裁剪和執行 opencv 轉換結合這兩個步驟并將它們應用于視頻以檢查可用的可用空間

過程

1. 安裝和導入依賴項

openCV 將允許我們導入圖像和視頻,然后我們可以對它們應用轉換,CVzone作為基于 openCV  的庫,它還允許我們使用與 openCV  相比所需語法更少的轉換,“Pickel”用于存儲在圖片上繪制的方框的位置,“numpy”用于應用簡單的轉換。

import cv2

import pickle

import cvzone

import numpy as np

我們將處理使用 parkingspacepicker.py 繪制框并存儲位置,并通過 pickel 在我們的 main.py 中使用這些位置

2.  繪制方框

在此圖像中,我們可以看到空間分布不均,并且間隔各不相同。

我們稍后將使用的視頻的相機處于靜態狀態,因此我們可以通過在框上手動繪制框來接近它。

為此,我們需要知道單個框的高度和寬度,然后我們將不得不嘗試不同的值以獲得完美形狀的框

import cv2

import pickle

import cvzone

import numpy as np

img = cv2.imread('carParkImg.png')

while True:

    cv2.rectangle(img,(50,1920),(157,240),(255,0,255),2)

    cv2.imshow("image", img)

    cv2.waitKey(1)

在此之后,我們得到 width 和 height = 107, 48 你也可以嘗試不同的值。

我們啟動一個列表來存儲這些值并編寫一個函數來檢測鼠標點擊操作,你可以在下一個片段中看到

img = cv2.imread('carParkImg.png')

width, height = 107, 48

def mouse_click(events, x, y, flags, params):

    if events == cv2.EVENT_LBUTTONDOWN:

        posList.append((x, y))

#and to see what we are drwaing on the screen 

while True:

    for pos in posList:

        cv2.rectangle(img, pos, (pos[0] + width, pos[1] + height), (255, 0, 255), 2)

    cv2.imshow("Image", img)

    cv2.setMouseCallback("Image", mouse_click)

    cv2.waitKey(1)

在 mouse_click 函數中,我們將events, x, y, flags, params作為參數傳遞,如果events == cv2.EVENT_LBUTTONDOWN,則將值 (x, y) 附加到 posList 并查看我們在屏幕上繪制的內容,我們將在我們的 posList 值上編寫一個 for 循環。

我在這里遇到了兩個問題:

在錯誤的位置繪制框加載圖像后只生成一幀,因此對該圖像的任何修改都不會顯示

對于第 1 個問題的解決方案,我修改了mouse_click函數,將右鍵單擊按鈕作為一個事件,然后我們將檢查我們的單擊點是否位于其中一個位置之間,我們將刪除它。

def mouse_click(events, x, y, flags, params):

    if events == cv2.EVENT_LBUTTONDOWN:

        posList.append((x, y))

    if events == cv2.EVENT_RBUTTONDOWN:

        for i, pos in enumerate(posList):

            x1, y1 = pos

            if x1 < x < x1 + width and y1 < y < y1 + height:

                posList.pop(i)

我們將檢查當前的x是否在x1<x<x1+width和y1<y<y1+height之間,如果在其中,則刪除它。我們需要知道要進行多少次迭代才能刪除它,為此我們可以使用enumerate獲取i并彈出i。

對于問題2-因為我們的圖像只被導入一次,所以無論在其上繪制什么都將保持不變,我們在網絡攝像頭或相機中不會遇到此問題,并且我們正在處理的是靜態圖像,因此我們必須在循環中導入它以獲得刪除框。

在繪制所有框后,現在我們必須將它們存儲為pickle對象并以一種方式存儲它們,以便我們不必每次都進行制作,并且我們可以使用先前的對象或修改現有的對象。

img = cv2.imread('carParkImg.png')

width, height = 107, 48

try:

    with open('CarParkPos', 'rb') as f:

        posList = pickle.load(f)

except:

    posList = []

def mouse_click(events, x, y, flags, params):

    if events == cv2.EVENT_LBUTTONDOWN:

        posList.append((x, y))

    if events == cv2.EVENT_RBUTTONDOWN:

        for i, pos in enumerate(posList):

            x1, y1 = pos

            if x1 < x < x1 + width and y1 < y < y1 + height:

                posList.pop(i)

    with open('CarParkPos', 'wb') as f:

        pickle.dump(posList, f)

while True:

    img = cv2.imread('carParkImg.png')

    for pos in posList:

        cv2.rectangle(img, pos, (pos[0] + width, pos[1] + height), (255, 0, 255), 2)

    cv2.imshow("Image", img)

    cv2.setMouseCallback("Image", mouse_click)

    cv2.waitKey(1)

這將創建一個對象 CarParkPos 并檢查該對象是否已經存在

圖像處理(main.py)

加載視頻饋送并循環進行循環,我們將對幀進行計數,當幀到達時,我們將重置它,以便獲得連續的視頻

import cv2

import pickle

import cvzone

import numpy as np

# video feed

cap = cv2.VideoCapture('carPark.mp4')

while True:

    if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT):

        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)

 success, img = cap.read()

 cv2.imshow("Image", img)

 cv2.waitKey(10)

將框位置加載到我們將使用 pickle 對象的視頻上,并定義我們之前找到的寬度和高度with open('CarParkPos', 'rb') as f:

    posList = pickle.load(f)

width, height = 107, 48

我們需要裁剪這些位置以供以后轉換,為此我們將編寫一個函數def checkParkingSpace(imgPro):

  for pos in posList:

    x, y = pos

      imgCrop = imgPro[y:y + height, x:x + width]

      cv2.imshow(str(x * y), imgCrop)

while True:

    if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT):

        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)

 for pos in posList:

     cv2.rectangle(img, pos, (pos[0] + width, pos[1] + height), (255, 0, 255), 2)

 success, img = cap.read()

 cv2.imshow("Image", img)

 cv2.waitKey(10)

裁剪后繪制出方框,這將為裁剪區域提供完美的視角,現在我們需要找出其中哪個區域有汽車。

我們可以通過查看像素計數來做到這一點,在圖像處理中,我們可以使用邊緣和角點檢測算法來將圖像轉換為二進制形式,并計算出圖像中的邊緣和角點數量。在二值化后的圖像中,黑色像素表示背景,白色像素表示前景。通過分析這些二值化后的圖像中的邊緣和角點數目,我們可以了解到關于該圖像的一些信息,如圖像是否具有結構性、復雜度等信息,來確定圖像的特點。在此基礎上,我們可以繼續下一步的分析或處理。

為了確定該區域是否包含汽車,我們必須首先使用 OpenCV 和 CVzone 進行一些閾值處理,我們將圖像轉換為灰度并應用高斯模糊,然后我們將其轉換為二值圖像,我們將使用自適應閾值和去除椒鹽噪聲,我們使用“medianBlur”和主動內核來去除噪聲,有時這些像素非常小,為了更好地區分,我們將使用膨脹操作。

應用所有濾鏡后的圖像

    if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT):

        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)

    success, img = cap.read()

    imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    imgBlur = cv2.GaussianBlur(imgGray, (3, 3), 1)

    imgThreshold = cv2.adaptiveThreshold(imgBlur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,

                                         cv2.THRESH_BINARY_INV, 25, 16)

    imgMedian = cv2.medianBlur(imgThreshold, 5)

    kernel = np.ones((3, 3), np.uint8)

    imgDilate = cv2.dilate(imgMedian, kernel, iterations=1)

    checkParkingSpace(imgDilate)

    cv2.imshow("Image", img)

    # cv2.imshow("ImageBlur", imgBlur)

    # cv2.imshow("ImageThres", imgMedian)

    cv2.waitKey(10)

所有的值都作為參數傳遞,通過嘗試不同的值來獲得,現在我們將這個處理過的圖像傳遞給我們的裁剪函數

做出預測def checkParkingSpace(imgPro):

    spaceCounter = 0

    for pos in posList:

        x, y = pos

        imgCrop = imgPro[y:y + height, x:x + width]

        # cv2.imshow(str(x * y), imgCrop)

        count = cv2.countNonZero(imgCrop)

        if count < 900:

            color = (0, 255, 0)

            thickness = 5

            spaceCounter += 1

        else:

            color = (0, 0, 255)

            thickness = 2

        cv2.rectangle(img, pos, (pos[0] + width, pos[1] + height), color, thickness)

        cvzone.putTextRect(img, str(count), (x, y + height - 3), scale=1,

                           thickness=2, offset=0, colorR=color)

    cvzone.putTextRect(img, f'Free:{spaceCounter}/{len(posList)}', (100, 50), scale=3,

                       thickness=5, offset=20, colorR=(0, 200, 0))

我們將處理后的圖像傳遞給此函數并計算像素,如果像素密度小于 900,則表明沒有汽車,如果大于900,則包含汽車并顯示文本,我們將使用 CVzone 庫,并使用 python f string Free:{spaceCounter}/{len(posList)} 來顯示計數器。

github:https://github.com/Tejaswi-kashyap-006/computervision_projects

       原文標題 : 車位數量檢測

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

發表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續

暫無評論

暫無評論

    人工智能 獵頭職位 更多
    掃碼關注公眾號
    OFweek人工智能網
    獲取更多精彩內容
    文章糾錯
    x
    *文字標題:
    *糾錯內容:
    聯系郵箱:
    *驗 證 碼:

    粵公網安備 44030502002758號