rellenar rectangulos personas objetos deteccion contornos contorno canny bordes opencv edge-detection

personas - deteccion de rectangulos opencv python



opencv-contando los bordes no direccionales de canny (1)

Creo que estás confundiendo la detección de bordes con detección de gradiente. Canny proporciona un mapa de bordes basado en la magnitud del gradiente (normalmente utiliza un operador de Sobel, pero puede usar otros) porque Canny solo devuelve la información de la magnitud del gradiente de umbral que no puede proporcionarle la información de orientación.

EDIT: debería aclarar que el algoritmo de Canny utiliza la orientación de gradiente para el paso de supresión no máxima. Sin embargo, la implementación de OpenCV de Canny oculta esta información de orientación de usted y solo devuelve un mapa de magnitud de borde.

El algoritmo básico para obtener la magnitud y la orientación del gradiente es el siguiente:

  1. Compute Sobel en la dirección X ( Sx ).
  2. Compute Sobel en la dirección Y ( Sy ).
  3. Calcule la magnitud de gradiente sqrt(Sx*Sx + Sy*Sy) .
  4. Calcule la orientación del degradado con arctan(Sy / Sx) .

Este algoritmo puede implementarse utilizando las siguientes funciones de OpenCV: Sobel , magnitud y fase .

A continuación se muestra una muestra que calcula la magnitud y la fase del gradiente, así como muestra un mapeo de color grueso de las orientaciones del gradiente:

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #include <vector> using namespace cv; using namespace std; Mat mat2gray(const cv::Mat& src) { Mat dst; normalize(src, dst, 0.0, 255.0, cv::NORM_MINMAX, CV_8U); return dst; } Mat orientationMap(const cv::Mat& mag, const cv::Mat& ori, double thresh = 1.0) { Mat oriMap = Mat::zeros(ori.size(), CV_8UC3); Vec3b red(0, 0, 255); Vec3b cyan(255, 255, 0); Vec3b green(0, 255, 0); Vec3b yellow(0, 255, 255); for(int i = 0; i < mag.rows*mag.cols; i++) { float* magPixel = reinterpret_cast<float*>(mag.data + i*sizeof(float)); if(*magPixel > thresh) { float* oriPixel = reinterpret_cast<float*>(ori.data + i*sizeof(float)); Vec3b* mapPixel = reinterpret_cast<Vec3b*>(oriMap.data + i*3*sizeof(char)); if(*oriPixel < 90.0) *mapPixel = red; else if(*oriPixel >= 90.0 && *oriPixel < 180.0) *mapPixel = cyan; else if(*oriPixel >= 180.0 && *oriPixel < 270.0) *mapPixel = green; else if(*oriPixel >= 270.0 && *oriPixel < 360.0) *mapPixel = yellow; } } return oriMap; } int main(int argc, char* argv[]) { Mat image = Mat::zeros(Size(320, 240), CV_8UC1); circle(image, Point(160, 120), 80, Scalar(255, 255, 255), -1, CV_AA); imshow("original", image); Mat Sx; Sobel(image, Sx, CV_32F, 1, 0, 3); Mat Sy; Sobel(image, Sy, CV_32F, 0, 1, 3); Mat mag, ori; magnitude(Sx, Sy, mag); phase(Sx, Sy, ori, true); Mat oriMap = orientationMap(mag, ori, 1.0); imshow("magnitude", mat2gray(mag)); imshow("orientation", mat2gray(ori)); imshow("orientation map", oriMap); waitKey(); return 0; }

Usando una imagen circular

Esto da como resultado las siguientes imágenes de magnitud y orientación:

Finalmente, aquí está el mapa de orientación del degradado:

ACTUALIZACIÓN: Abid en realidad hizo una gran pregunta en los comentarios "¿qué se entiende por orientación aquí?", Lo que pensé que necesitaba un poco más de discusión. Supongo que la función de phase no cambia los cuadros de coordenadas desde el punto de vista de procesamiento de imagen normal del eje y positivo hacia abajo, y el eje x positivo es el correcto. Dada esta suposición que conduce a la siguiente imagen que muestra los vectores de orientación de gradiente alrededor del círculo:

Puede ser difícil acostumbrarse a esto ya que los ejes se invierten de lo que normalmente usamos en la clase de matemática ... Por lo tanto, la orientación del gradiente es el ángulo formado por el vector normal a la superficie del degradado en la dirección del cambio creciente.

Espero que hayas encontrado eso útil!

¿Alguien puede ayudarme a contar la cantidad de bordes no direccionales utilizando la detección de cannyedge de OpenCV? Tengo una imagen cannyEdge de opencv y me gustaría tener un histograma basado en las direcciones de los bordes y allí puedo contar la cantidad de bordes direccionales y no direccionales.