simpleblobdetector simple detector aruco opencv

aruco - Cómo usar OpenCV SimpleBlobDetector



opencv simple blob detector (4)

En lugar de cualquier biblioteca adicional de detección de blobs, ¿cómo uso la clase cv::SimpleBlobDetector y su función detectblobs() ?



Puede almacenar los parámetros para el detector de blobs en un archivo, pero esto no es necesario. Ejemplo:

// set up the parameters (check the defaults in opencv''s code in blobdetector.cpp) cv::SimpleBlobDetector::Params params; params.minDistBetweenBlobs = 50.0f; params.filterByInertia = false; params.filterByConvexity = false; params.filterByColor = false; params.filterByCircularity = false; params.filterByArea = true; params.minArea = 20.0f; params.maxArea = 500.0f; // ... any other params you don''t want default value // set up and create the detector using the parameters cv::SimpleBlobDetector blob_detector(params); // or cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params) // detect! vector<cv::KeyPoint> keypoints; blob_detector.detect(image, keypoints); // extract the x y coordinates of the keypoints: for (int i=0; i<keypoints.size(); i++){ float X = keypoints[i].pt.x; float Y = keypoints[i].pt.y; }


Python: lee la imagen blob.jpg y realiza la detección de blobs con diferentes parámetros.

#!/usr/bin/python # Standard imports import cv2 import numpy as np; # Read image im = cv2.imread("blob.jpg") # Setup SimpleBlobDetector parameters. params = cv2.SimpleBlobDetector_Params() # Change thresholds params.minThreshold = 10 params.maxThreshold = 200 # Filter by Area. params.filterByArea = True params.minArea = 1500 # Filter by Circularity params.filterByCircularity = True params.minCircularity = 0.1 # Filter by Convexity params.filterByConvexity = True params.minConvexity = 0.87 # Filter by Inertia params.filterByInertia = True params.minInertiaRatio = 0.01 # Create a detector with the parameters detector = cv2.SimpleBlobDetector(params) # Detect blobs. keypoints = detector.detect(im) # Draw detected blobs as red circles. # cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures # the size of the circle corresponds to the size of blob im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) # Show blobs cv2.imshow("Keypoints", im_with_keypoints) cv2.waitKey(0)

C ++: Lee la imagen blob.jpg y realiza la detección de blobs con diferentes parámetros.

#include "opencv2/opencv.hpp" using namespace cv; using namespace std; int main( int argc, char** argv ) { // Read image Mat im = imread( "blob.jpg", CV_LOAD_IMAGE_GRAYSCALE ); // Setup SimpleBlobDetector parameters. SimpleBlobDetector::Params params; // Change thresholds params.minThreshold = 10; params.maxThreshold = 200; // Filter by Area. params.filterByArea = true; params.minArea = 1500; // Filter by Circularity params.filterByCircularity = true; params.minCircularity = 0.1; // Filter by Convexity params.filterByConvexity = true; params.minConvexity = 0.87; // Filter by Inertia params.filterByInertia = true; params.minInertiaRatio = 0.01; SimpleBlobDetector detector(params); // Storage for blobs std::vector<KeyPoint> keypoints; // Detect blobs detector.detect( im, keypoints); // Draw detected blobs as red circles. // DrawMatchesFlags::DRAW_RICH_KEYPOINTS flag ensures // the size of the circle corresponds to the size of blob Mat im_with_keypoints; drawKeypoints( im, keypoints, im_with_keypoints, Scalar(0,0,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS ); // Show blobs imshow("keypoints", im_with_keypoints ); waitKey(0);

La respuesta ha sido copiada de este tutorial que escribí en LearnOpenCV.com explicando varios parámetros de SimpleBlobDetector. Puede encontrar detalles adicionales sobre los parámetros en el tutorial.


// creation cv::SimpleBlobDetector * blob_detector; blob_detector = new SimpleBlobDetector(); blob_detector->create("SimpleBlobDetector"); // change params - first move it to public!! blob_detector->params.filterByArea = true; blob_detector->params.minArea = 1; blob_detector->params.maxArea = 32000; // or read / write them with file FileStorage fs("test_fs.yml", FileStorage::WRITE); FileNode fn = fs["features"]; //blob_detector->read(fn); // detect vector<KeyPoint> keypoints; blob_detector->detect(img_text, keypoints); fs.release();

Sé por qué, pero los params están protegidos. Así que lo moví en el archivo features2d.hpp para que sea público:

virtual void read( const FileNode& fn ); virtual void write( FileStorage& fs ) const; public: Params params; protected: struct CV_EXPORTS Center { Point2d loc

Si no lo hace, la única forma de cambiar los parámetros es crear un archivo ( FileStorage fs("test_fs.yml", FileStorage::WRITE); ), luego ábralo en el bloc de notas y edítelo. O tal vez hay otra manera, pero no estoy enterado.