2012-10-03 3 views
13

Je sais que dans OpenCV 2.1 nous avions une fonction pour définir ROI: cvSetImageROI(), mais une telle fonction n'existe pas en 2.4 (ou du moins je ne peux pas le trouver dans ses manuels et aide . section)Comprendre la région d'intérêt dans openCV 2.4

est cependant ici le seul code utile que je pouvais trouver qui utilise OpenCV 2.4 pour le retour sur investissement de mage, mais je vais avoir du mal à comprendre:

// 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); 

ici, ils veulent ajouter un journal très petit à une grande image en bas à droite de l'image originale. Donc, ce que je comprends d'ici, c'est qu'une autre matrice est créée pour contenir le retour sur investissement. Ses dimensions données en utilisant la fonction rect, et la taille est donnée égale à celle du petit logo qu'ils veulent ajouter.

Puis c'est ce qui me trouble: cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI); ici la source 1 de addWeighted est le jeu de dimensions ROI, la source 2 est le logo et la destination est également le jeu de dimensions ROI. Est-ce correct? ou ai-je oublié quelque chose? Ensuite, le résultat est affiché avec le logo ajouté à la grande image. Où dans ces commandes était la grande image incluse.

Aussi avant de demander ici je voulais essayer le code moi-même pour peut-être aider à clarifier la situation. mais je reçois cette erreur, comme l'image() ne reconnaît pas: '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; 

}

Répondre

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

Le constructeur cv :: Mat Wich prend un rectangle comme paramètre:

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

renvoie une matrice qui pointe vers la ROI de l'image d'origine, située à l'emplacement spécifié par le rectangle. donc imageROI est vraiment la région d'intérêt (ou sous-image/sous-image) de l'image originale "image". Si vous modifiez imageROI, cela modifiera la matrice originale, plus grande. Comme pour votre exemple, le problème est que vous appelez le constructeur à partir d'un objet qui n'existe pas (image). Vous devez remplacer:

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

par:

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

en supposant que src1 est votre "grande image" que vous voulez insérer le logo dans (le logo étant car1.jpg). Vous ne devriez pas oublier de lire d'abord votre grande image, d'ailleurs!

+0

C'est génial. Merci beaucoup. C'est la raison pour laquelle je devenais confus, je pensais que l'image était une fonction et je n'ai trouvé aucune mention de la grande image. Merci d'avoir éclairci cela. Aussi une dernière question concernant ce sujet serait, comment puis-je trouver la position du pixel de l'apex du rectangle. Je suppose que je veux ajouter mon logo en haut à gauche de src 1, puis dans le 'src1 (Rect (385,270, logo.cols, logo.rows)),' quelle position dois-je donner à la place de la dite 385,270? Y at-il un moyen facile de trouver cela? Merci – StuckInPhD

+0

Vous pouvez utiliser les coordonnées dans votre ROI, soit 385,270 dans l'image correspond à 0,0 dans votre ROI. Cela fonctionnera tant que vous utilisez l'accesseur de cv :: Mat, comme Mat :: at (int row, int col). Si vous utilisez directement les données brutes, vous devez faire attention à ce que la disposition réelle des données dans le ROI soit la disposition des données de l'image originale – remi

Questions connexes