Puede intentar usar un algoritmo de escaneo - Para cada línea del polígono (entonces y = min (y) .. max (y)), obtenga l = min (x) yr = max (x). Calcule la pendiente izquierda/derecha (deltax) y compárela con la pendiente de la línea anterior. Si cambió (use algo de tolerancia aquí), se encuentra en una esquina del rectángulo (o cerca de él). Eso no funcionará para todos los casos, ya que la pendiente no puede ser tan exacta debido a la baja resolución, pero para rectángulos grandes y pendientes no muy similares, esto debería funcionar.
Al menos, funciona bien para su ejemplo:
X0000000000X l = 0, r = 11
.00000000000 l = 1, r = 11, deltaxl = 1, deltaxr = 0
..X000000000 l = 2, r = 11, deltaxl = 1, deltaxr = 0
.....0000000 l = 5, r = 11, deltaxl = 3, deltaxr = 0
........0000 l = 8, r = 11, deltaxl = 3, deltaxr = 0
...........X l = 11, r = 11, deltaxl = 3, deltaxr = 0
Se empieza con la parte superior del rectángulo donde se obtienen dos valores diferentes de L y R, por lo que ya tiene dos de las esquinas. En el lado izquierdo, para las primeras tres líneas obtendrá deltax = 1, pero después de eso, obtendrá deltax = 3, por lo que hay una esquina en (3, 3). En el lado derecho, nada cambia, deltax = 0, por lo que solo obtiene el punto al final.
Tenga en cuenta que está "recogiendo" esquinas aquí, por lo que si no tiene 4 esquinas al final, las pendientes son demasiado similares (o si tiene una imagen de un triángulo) y puede cambiar a una diferente (más exacto) algoritmo o simplemente dar un error. Lo mismo si tiene más de 4 esquinas o alguna otra cosa extraña como agujeros en el rectángulo. Parece que hay algún tipo de detección de imagen involucrada, por lo que estos casos pueden ocurrir, ¿no?
Hay casos en los que un simple deltax = (x - LASTx) no va a funcionar bien, vean este ejemplo para el lado izquierdo de un rectángulo:
xxxxxx
xxxxx deltax = 1 dy/dx = 1/1 = 1
xxxxx deltax = 0 dy/dx = 2/1 = 2
xxxx deltax = 1 dy/dx = 3/2 = 1.5
xxxx deltax = 0 dy/dx = 4/2 = 2
xxx deltax = 1 dy/dx = 5/3 = 1.66
veces deltax es 0, a veces es 1 . Es mejor usar la pendiente de la línea desde el punto real al punto superior izquierdo/derecho (deltay/deltax). Al usarlo, igual tendrá que seguir con una tolerancia, pero sus valores serán más exactos con cada nueva línea.
¿Por qué no lo que tienes que trabajar? Necesitará encontrar el máximo real y el mínimo real (examinando todos los puntos que tiene antes de decidir cuál es realmente el máximo y el mínimo), pero en algún momento tendrá que confiar en algunos de los datos para contarle cómo debería ser el rectángulo _. –
¿Cómo obtuviste la silueta del rectángulo sin tener coordenadas de puntos para las esquinas? – Stewbob
Tengo una imagen como entrada, con una función de umbral puedo separar la parte interesante del fondo. – dutchflyboy