我有一个脚本可以检测出行人和行人的危险区域,但是我需要检测行人是否处于危险区域内。
我的危险区域是多边形,被发现的人民是一个盒子!
检测多边形内的盒子的最佳方法是什么?
脚本示例:
# -*- coding: utf-8 -*-
import numpy as np
import cv2
import time
import math
class DetectorAPI:
cap = cv2.VideoCapture("VideoCone.MOV")
while True:
r, img = cap.read()
#DEFINE A ÁREA DO VIDEO EM QUE O MODELO IRA ATUAR
#img = img[10:1280, 230:1280]
img = cv2.resize(img, (800, 600))
overlay = img.copy()
#Frame Detectação Red Zone
vermelho_inicio = np.array([0, 9, 178])
vermelho_fim = np.array([255, 40, 255])
#Mascara de detecção do modelo de cor
mask = cv2.inRange(img, vermelho_inicio, vermelho_fim)
#Pontos e desenho do poligono (Objeto detectado no laser)
np_points = np.transpose(np.nonzero(mask))
points = np.fliplr(np_points) # opencv uses flipped x,y coordinates
approx = cv2.convexHull(points)
DangerArea = cv2.fillPoly(img, [approx], (0,0,255))
#Transparencia
cv2.addWeighted(overlay,0.3,img,1-0.65,0,img);
edges = cv2.Canny(mask,30,120)
#DESENHO AS LINHAS NO LASER (Cone)
lines = cv2.HoughLinesP(edges, 5, np.pi/180, 30, maxLineGap=50)
a,b,c = lines.shape
if lines is not None:
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)
#CAPTURO AS INFORMAÇÕES DO FRAME
height, width, channels = img.shape
#DIVISÃO PARA CAPTURAR O CENTRO DA IMAGEM
upper_left = (int(width / 2), int(height / 4))
bottom_right = (int(width * 2 / 2), int(height * 3 / 4))
#ESCREVO O RETANGULO NO CENTRO DO VÍDEO
cv2.rectangle(img,(100,150), (200,250),(0,152,112),1);
cv2.rectangle(img,(500,150), (420,250),(0,100,255),1);
#Escrevo o texto na Danger Area
#cv2.putText(DangerArea,'Danger Area',(int(width / 4),int(height * 3 / 4)), cv2.FONT_HERSHEY_SIMPLEX, 0.5,(255,255,255),2,cv2.LINE_AA)
#cv2.addWeighted(overlay,0.3,img,1-0.4,0,img);
#Imprimo no console o centro da imagem
print('Upper_Left: '+str(upper_left)+' bottom_right: '+str(bottom_right));
#Exibe o video
cv2.imshow("edges", edges)
cv2.imshow("Detectar Pessoas", img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
答案 0 :(得分:1)
p0 = (10,10)
p1 = (400,400)
is_p0_ok = cv2.pointPolygonTest(approx, p0, False) < 0
is_p1_ok = cv2.pointPolygonTest(approx, p1, False) < 0
print(is_p0_ok)
>>> True
print(is_p1_ok)
>>> False
根据您的实现,您可能需要使用cv2.pointPolygonTest
或矩形的所有角来检查矩形的中心。
修改
如何传递变量p0和p1的框坐标?因为box具有四个值cv2.rectangle(img,(box [1],box [0]),(box [3],box [2]),(255,0,0),2)和我需要检查所有框是否都在多边形内
p0 = (box[1],box[0])
p1 = (box[1], box[2])
p2 = (box[3],box[2])
p3 = (box[3], box[0])
rect = [p0,p1,p2,p3]
rect_pts_inside = [cv2.pointPolygonTest(approx, pt, False) < 0 for pt in rect]
whole_rect_inside_polygon = all(rect_pts_inside)
part_of_rect_inside_polygon = any(rect_pts_inside)