Come ottenere un rettangolo attorno all'oggetto target usando le funzionalità estratte da seta

StackOverflow https://stackoverflow.com/questions/8896771

  •  29-10-2019
  •  | 
  •  

Domanda

Sto realizzando un progetto in OpenCV sul rilevamento di oggetti che consiste nell'abbinare l'oggetto nell'immagine del modello con l'immagine di riferimento. Usando l'algoritmo SIFT Le caratteristiche vengono rilevate e abbinate acurate, ma voglio un rettagle attorno alle caratteristiche abbinate che il mio algoritmo utilizza la prima tecnica KD-Tree Ean per ottenere le partite

È stato utile?

Soluzione

Se vuoi un rettangolo attorno all'oggetto rilevato, qui Hai un esempio di codice esattamente con quello. Devi solo farlo Disegna un rettangolo Intorno all'omografia H.

Spero che sia d'aiuto. Buona fortuna.

Altri suggerimenti

Uso il seguente codice, adattato dall'algoritm di surf in OpenCV (moduli/caratteristiche2d/src/surf.cpp) per estrarre un circuito di un keypoint.

Oltre ad altri esempi basati su rettangoli e ROI, questo codice restituisce la patch correttamente orientata in base all'orientamento e alla scala determinati dall'algoritmo di rilevamento delle funzioni (entrambi disponibili nel KeyPoint Struttura).

Un esempio dei risultati del rilevamento su diverse immagini:

SIFT keypoint patch extract example

const int PATCH_SZ = 20;
Mat extractKeyPoint(const Mat& image, KeyPoint kp)
{
    int x = (int)kp.pt.x;
    int y = (int)kp.pt.y;
    float size = kp.size;
    float angle = kp.angle;

    int win_size = (int)((PATCH_SZ+1)*size*1.2f/9.0);
    Mat win(win_size, win_size, CV_8UC3);

    float descriptor_dir = angle * (CV_PI/180);
    float sin_dir = sin(descriptor_dir);
    float cos_dir = cos(descriptor_dir);
    float win_offset = -(float)(win_size-1)/2;
    float start_x = x + win_offset*cos_dir + win_offset*sin_dir;
    float start_y = y - win_offset*sin_dir + win_offset*cos_dir;
    uchar* WIN = win.data;
    uchar* IMG = image.data;
    for( int i = 0; i < win_size; i++, start_x += sin_dir, start_y += cos_dir )
    {
        float pixel_x = start_x;
        float pixel_y = start_y;
        for( int j = 0; j < win_size; j++, pixel_x += cos_dir, pixel_y -= sin_dir )
        {
            int x = std::min(std::max(cvRound(pixel_x), 0), image.cols-1);
            int y = std::min(std::max(cvRound(pixel_y), 0), image.rows-1);
            for (int c=0; c<3; c++) {
                WIN[i*win_size*3 + j*3 + c] = IMG[y*image.step1() + x*3 + c];
            }
        }
    }
    return win;
}

Non sono sicuro che la scala sia del tutto ok, ma è presa dalla fonte di surf e i risultati mi sembrano rilevanti.

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