Cómo juzgar si un punto está en el medio de una caja

En el proceso de fusión de datos estructurados de radar y objetivos detectados por aprendizaje profundo, cómo determinar rápidamente si un punto de objetivo de radar está en el cuadro (si la fusión es exitosa) después de que el objetivo adquirido por el radar se convierta del sistema de coordenadas mundial al sistema de coordenadas de píxeles.

Puede consultar dos métodos:

1. Método de juicio directo

Obtenga directamente las coordenadas de píxeles del objetivo del radar en la imagen y luego compare si la coordenada x del objetivo del radar está entre [xmin, xmax] del cuadro bbox, y si la coordenada y está entre [ymin, ymax] del bbox box, si ambos son True, significa que está en el bbox box,
inserte la descripción de la imagen aquí
el código es el siguiente:

def check_in_box(box, point):
    '''
    box : xyxy format
    point: x,y
    '''
    x, y = point
    if (x >= box[0] & x <= box[2]) & (y >= box[1] & y <= box[3]):
        return True
    else:
        return False

2. Método del vector de coordenadas

El producto vectorial de vectores también se llama producto vectorial, producto externo, etc.
El resultado del producto vectorial de a y b es un vector, denotado como a×b. El ángulo entre a y b es θ, entonces su modo y dirección son:
modo: |a×b| = |a||b|senθ
dirección: perpendicular al plano formado por a y b, y satisface la regla de la derecha
De la fórmula anterior se puede entender que el resultado del producto vectorial de los vectores a y b depende de sen θ Si el valor de sen θ es mayor que 0, de acuerdo con la regla de la mano derecha, significa que el vector a puede convertirse en el dirección del vector b en el sentido contrario a las agujas del reloj En términos sencillos, es b El vector está en el lado izquierdo del vector a, y los otros casos son similares, por lo que no los repetiré aquí. Por lo tanto, se puede juzgar si el punto fijo está dentro del marco rectangular según este principio.
detalles de la siguiente manera:

  • 1. El rectángulo y el punto p se muestran en la siguiente figura.
    inserte la descripción de la imagen aquí
  • 2. Determinar si el punto p está dentro del rectángulo, principalmente para determinar si el punto p está dentro del rectángulo, lo que equivale a juzgar: 1. el punto p está entre AB y CD, 2. el punto p está entre AD y BC, por lo que solo se requiere cálculo Los siguientes valores son suficientes:
    (1) BA×BP>0&DC×DP>0 significa que el punto P está entre AB y CD
    (2) AD×AP>0&CB×CP>0 significa que el punto P está entre AB y CD AD y BC al
    mismo tiempo Cumpliendo las dos condiciones anteriores se puede verificar si P está dentro del rectángulo.
    En el sistema de coordenadas cartesianas del plano,
    el vector a=(x1, y1)
    y el vector b=(x2, y2)
    , entonces |a×b| = |x1y2-x2y1|

el código se muestra a continuación:

def check_in_box(box, point):
    '''
    box : xyxy format
    point: x,y
    '''
    x, y = point
    xmin, ymin, xmax, ymax = box
    BA = (xmin - xmax, 0)
    BP = (x - xmax, y - ymin)
    DC = (xmax - xmin, 0)
    DP = (x - xmin, y - ymax)
    AD = (0, ymax - ymin)
    AP = (x - xmin, y - ymin)
    CB = (0, ymin - ymax)
    CP = (x - xmax, y - ymax)
    
    a = BA[0]*BP[1]-BA[1]*BP[0]  # BA×BP
    b = DC[0]*DP[1]-DC[1]*DP[0]  # DC×DP
    c = AD[0]*AP[1]-AD[1]*AP[0]  # AD×AP
    d = CB[0]*CP[1]-CB[1]*CP[0]  # CB×CP

    if (a>0&b>0)&(c>0&d>0):
        return True
    else:
        False

3. Método de rayos

El principio fundamental es que los puntos que existen dentro o fuera de la forma convexa, usándola como punto de partida, se extienden hacia afuera infinitamente, y el número de puntos de intersección con los lados de la forma convexa, si es un número par, el punto está fuera de la forma convexa, si es impar, está dentro de la forma convexa.
El código c++ para su implementación específica es el siguiente:

#include"PtInPolygon.h"

bool PtInPolygon(Point2d p, vector<Point2d> &ptpolygon, int nCount)
{
    
    
	int nCross = 0;
	for (int i = 0; i < nCount; i++)
	{
    
    
		Point2d p1 = ptpolygon[i];
		Point2d p2 = ptpolygon[(i + 1) % nCount];
		if (p1.y == p2.y) {
    
    
			continue;
		}
		if (p.y < min(p1.y, p2.y)) {
    
    
			continue;
		}
		if (p.y >= max(p1.y, p2.y)) {
    
    
			continue;
		}

		double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;
		if (x > p.x) {
    
    
			nCross++; //统计在点右侧射线的交点
		}
	}
	if ((nCross % 2) == 1) {
    
     // 在区域内部
		return true;
	}
	else
	{
    
    
		return false;
	}
}

Lo anterior es mi resumen, si tiene alguna pregunta, corríjame.

Supongo que te gusta

Origin blog.csdn.net/caobin_cumt/article/details/129831820
Recomendado
Clasificación