2012-10-03 10 views
13

So che in OpenCV 2.1 avevamo una funzione per impostare il ROI: cvSetImageROI(), ma tale funzione non esiste in 2.4 (o almeno non riesco a trovarla nei suoi manuali e nella sua guida . sezione)Capire la regione di interesse in openCV 2.4

però qui è l'unico codice utile che ho trovato che utilizza OpenCV 2.4 per mago ROI, ma sto avendo difficoltà a comprenderlo:

// define image ROI 
cv::Mat imageROI; 
imageROI= image(cv::Rect(385,270,logo.cols,logo.rows)); 
// add logo to image 
cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI); 

qui vogliono aggiungere un piccolo registro per una grande immagine in basso a destra dell'immagine originale.

Quindi quello che capisco da qui è che viene creata un'altra matrice per contenere il ROI. Le sue dimensioni date usando la funzione rect e le dimensioni sono date uguali a quelle del piccolo logo che vogliono aggiungere.

Quindi questo è ciò che mi confonde: cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI); qui la fonte 1 di addWeighted è la dimensione della ROI impostata, la sorgente 2 è il logo e la destinazione è anche le dimensioni della ROI impostate. È corretto? O mi sta sfuggendo qualcosa?

Dopo questo il risultato viene visualizzato con il logo aggiunto alla grande immagine. Dove in questi comandi c'era la grande immagine inclusa.

Anche prima di chiedere qui volevo provare il codice per aiutare forse a chiarire la situazione. ma ottengo questo errore, come l'immagine() non viene riconosciuto: 'image': identifier not found

int _tmain(int argc, _TCHAR* argv[]) 
{ 
Mat src1, imageROI, logo; 

logo = imread("c:\\car1.jpg", -1); 

imageROI= image(Rect(385,270,logo.cols,logo.rows)); 

addWeighted(imageROI,1.0,logo,0.3,0.,imageROI); 


namedWindow("meh", CV_WINDOW_AUTOSIZE); 
imshow("meh", imageROI); 
waitKey(0); 


return 0; 

}

risposta

21
cv::Mat imageROI; 
imageROI= image(cv::Rect(385,270,logo.cols,logo.rows)); 

Il cv :: Mat costruttore Wich prende un rettangolo come parametro:

Mat::Mat(const Mat& m, const Rect& roi) 

restituisce una matrice che punta alla ROI dell'immagine originale, situata nella posizione specificata dal rettangolo. quindi imageROI è davvero la regione di interesse (o sottoimmagine/sottomatrice) dell'immagine originale "immagine". Se modifichi imageROI, di conseguenza modificherà la matrice originale, più grande.

Come per l'esempio, il problema è che si sta chiamando il costruttore da un oggetto che non esiste (immagine). È necessario sostituire:

imageROI= image(Rect(385,270,logo.cols,logo.rows)); 

da:

imageROI= src1(Rect(385,270,logo.cols,logo.rows)); 

supponendo che src1 è il vostro "grande immagine" che si desidera inserire il logo nel (il logo essendo car1.jpg). A proposito, non dimenticare di leggere prima la tua grande immagine!

+0

Questo è fantastico. Molte grazie. Questo è il motivo per cui mi sono confuso, ho pensato che l'immagine fosse una funzione e non ho trovato alcuna menzione della grande immagine. Grazie per averlo chiarito. Anche un'ultima domanda riguardante questo argomento sarebbe, come trovo la posizione dei pixel dell'apice del rettangolo. Voglio dire, suppongo di voler aggiungere il mio logo in alto a sinistra di src 1, quindi in 'src1 (Rect (385,270, logo.cols, logo.rows));' quale posizione dovrei dare al posto di detto 385,270? C'è un modo semplice per trovarlo? Grazie – StuckInPhD

+0

Puoi utilizzare le coordinate all'interno del tuo ROI, ovvero 385.270 nell'immagine corrisponde a 0,0 nella tua ROI. Questo funzionerà fintanto che utilizzerai l'accessor di cv :: Mat, come Mat :: at (int row, int col). Se si utilizzano direttamente i dati non elaborati, si deve prestare attenzione che il layout dei dati effettivo nella ROI è il layout dei dati dell'immagine originale – remi

Problemi correlati