Domanda

Dato un oggetto su un semplice sfondo bianco, qualcuno sa se OpenCV fornisce funzionalità per rilevare facilmente un oggetto da un frame acquisito?

Sto cercando di individuare gli angoli / i punti centrali di un oggetto (rettangolo). Il modo in cui lo sto facendo attualmente è con la forza bruta (la scansione dell'immagine per l'oggetto) e non è preciso. Mi chiedo se ci sia funzionalità sotto il cofano di cui non sono a conoscenza.

Modifica dettagli : Le dimensioni sono quasi le stesse di una piccola lattina di soda. La telecamera è posizionata sopra l'oggetto, per dargli un aspetto 2D / Rettangolo. L'orientamento / angolo dalla fotocamera è casuale, che viene calcolato dai punti d'angolo.

È solo uno sfondo bianco, con l'oggetto su di esso (nero). La qualità dello scatto riguarda ciò che ti aspetteresti di vedere da una webcam Logitech.

Una volta ottenuti i punti d'angolo, calcolo il centro. Il punto centrale viene quindi convertito in centimetri.

Sta perfezionando solo il 'come' ottengo quei 4 angoli su cui sto cercando di concentrarmi. Puoi vedere il mio metodo di forza bruta con questa immagine: Image

È stato utile?

Soluzione

Esiste già un esempio di come eseguire il rilevamento dei rettangoli in OpenCV (guarda in samples / squares.c), ed è abbastanza semplice, in realtà.

Ecco l'algoritmo grezzo che usano:

0. rectangles <- {}
1. image <- load image
2. for every channel:
2.1  image_canny <- apply canny edge detector to this channel
2.2  for threshold in bunch_of_increasing_thresholds:
2.2.1   image_thresholds[threshold] <- apply threshold to this channel
2.3  for each contour found in {image_canny} U image_thresholds:
2.3.1   Approximate contour with polygons
2.3.2   if the approximation has four corners and the angles are close to 90 degrees.
2.3.2.1    rectangles <- rectangles U {contour}

Non una traslitterazione esatta di ciò che stanno facendo, ma dovrebbe aiutarti.

Altri suggerimenti

Spero che questo aiuti, usa il metodo moment per ottenere il centroide di un'immagine in bianco e nero.

cv::Point getCentroid(cv::Mat img)
{
    cv::Point Coord;
    cv::Moments mm = cv::moments(img,false);
    double moment10 = mm.m10;
    double moment01 = mm.m01;
    double moment00 = mm.m00;
    Coord.x = int(moment10 / moment00);
    Coord.y = int(moment01 / moment00);
    return Coord;
}

OpenCV ha un sacco di funzioni che possono aiutarti a raggiungere questo obiettivo. Scarica Emgu.CV per un pacchetto C # .NET nella libreria se stai programmando in quella lingua.

Alcuni metodi per ottenere ciò che desideri:

  1. Trova gli angoli come prima - ad es. quot &; & CornerHarris quot; Funzione OpenCV

  2. Soglia dell'immagine e calcola il baricentro - vedi http : //www.roborealm.com/help/Center%20of%20Gravity.php ... questo è il metodo che userei. È anche possibile eseguire il limite nella routine COG. cioè cog_x + = * imagePtr < 128? 255: 0;

  3. Trova i momenti dell'immagine per dare rotazione, centro di gravità ecc. & Quot; Momenti quot &; Funzione OpenCV. (Non l'ho usato)

  4. (modifica) La libreria AForge.NET ha funzioni di rilevamento degli angoli, nonché un progetto di esempio (MotionDetector) e librerie per la connessione alle webcam. Penso che questo sarebbe il modo più semplice di procedere, supponendo che tu stia utilizzando Windows e .NET.

Di solito si chiama analisi BLOB in altre librerie di visione artificiale. Non ho ancora usato Opencv.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top