0

I have an script that detect the Danger Area for pedrestrians and the pedrestrians, but i need to detect if the pedrestrians in inside of danger área.

My danger área is an polygone and the peoples detected is an box!

What is the best method to detect an box inside a polygone?

enter image description here

Script Sample:

# -*- 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
Matheus Arruda
  • 195
  • 1
  • 11
  • apart from checking if corner points are within polygon, if an intersection of the two polygons is fine try this https://stackoverflow.com/questions/2272179/a-simple-algorithm-for-polygon-intersection – chris Jun 18 '19 at 12:37

1 Answers1

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

Depending on your implementation, you might want to check the center of the rectangle using cv2.pointPolygonTest, or all it's corners.

Edit

How to i pass the cordinates of box for variables p0 and p1? Because box has a four value cv2.rectangle(img,(box[1],box[0]),(box[3],box[2]),(255,0,0),2), and i need to check if all box is inside of polygone

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)
zteffi
  • 660
  • 5
  • 18
  • How to i pass the cordinates of box for variables p0 and p1? Because box has a four value cv2.rectangle(img,(box[1],box[0]),(box[3],box[2]),(255,0,0),2), and i need to check if all box is inside of polygone – Matheus Arruda Jun 19 '19 at 00:53