如何检测等高线的位置

2024-04-28 13:50:37 发布

您现在位置:Python中文网/ 问答频道 /正文

一般来说,我对opencv和python都很陌生。我想制作一个程序,用摄像机计算汽车数量。我已经做了这个程序,我已经找到了等高线,但问题是我不知道如何知道等高线在哪条车道上的确切位置。我已经用下面的油漆做了一个例子contours on a 4 lane road

在上图中,北面有一辆车,南面有两辆车,西面有三辆车,东面有两辆车。我想知道如何检测轮廓的位置。多谢各位

from picamera.array import PiRGBArray
from picamera import PiCamera
import picamera.array
import numpy as np
import time
import cv2
import RPi.GPIO as GPIO
import time
import sign2

GPIO.setmode(GPIO.BCM)


cam = PiCamera()
cam.resolution=(480,480)
cam.framerate=30
raw=PiRGBArray(cam, size=(480,480))

time.sleep(0.1)

colorLower = np.array([0,100,100])
colorUpper = np.array([179,255,255])

purplelow = np.array([125,100,100])
purpleup = np.array([136,255,255])

initvert = 0
inithoriz = 0
initverta = 0
inithoriza = 0




for frame in cam.capture_continuous(raw, format="bgr", use_video_port=True):
    frame = frame.array
    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

    purplemask = cv2.inRange(hsv,purplelow,purpleup)
    
    mask = cv2.inRange(hsv,colorLower,colorUpper)
    mask = cv2.blur(mask,(3,3))
    mask= cv2.dilate(mask,None,iterations=5)
    mask= cv2.erode(mask,None,iterations=1)
    mask= cv2.dilate(mask,None,iterations=3)

    purplemask = cv2.inRange(hsv,purplelow,purpleup)
    purplemask = cv2.blur(purplemask,(3,3))
    purplemask= cv2.dilate(purplemask,None,iterations=5)
    purplemask= cv2.erode(purplemask,None,iterations=1)
    purplemask= cv2.dilate(purplemask,None,iterations=3)
    

    
    me,thresh = cv2.threshold(mask,127,255,cv2.THRESH_BINARY)
    me,thresh2 = cv2.threshold(mask,127,255,cv2.THRESH_BINARY)
    
    cnts = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2]
    center = None
    cnts2 = cv2.findContours(thresh2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2]
    center = None

    vert = 0
    horiz = 0
    verta = 0
    horiza = 0 

Tags: importnonegpiotimenpmaskarraycv2
1条回答
网友
1楼 · 发布于 2024-04-28 13:50:37

找到轮廓线&;它们在代码中的质心添加了以下内容。质心列表存储在centroids

conts, hier = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
centroids = []

for c in conts[0:-1]:       
    x = int(sum(c[:,0,0]) / len(c))
    y = int(sum(c[:,0,1]) / len(c))
    centroids.append([x, y])
    # if you want to display on original image
    cv2.circle(frame, (x, y), 3, (255, 255, 0), -1) 

相关问题 更多 >