OpenCV Image De Couture
Je suis à l'aide de code suivant à point pour les images de l'entrée. Pour un inconnu
pourquoi le résultat de sortie est de la merde!
Il semble que l'homographie de la matrice est mal (ou est affecté à tort)
parce que l'image transformée est une sorte de "exploités star"!
J'ai commenté la partie qui, je pense, est la source du problème
mais je ne peux pas le réaliser.
Toute aide ou un point est appriciated!
Avoir une belle journée,
Ali
void Stitch2Image(IplImage *mImage1, IplImage *mImage2)
{
//Convert input images to gray
IplImage* gray1 = cvCreateImage(cvSize(mImage1->width, mImage1->height), 8, 1);
cvCvtColor(mImage1, gray1, CV_BGR2GRAY);
IplImage* gray2 = cvCreateImage(cvSize(mImage2->width, mImage2->height), 8, 1);
cvCvtColor(mImage2, gray2, CV_BGR2GRAY);
//Convert gray images to Mat
Mat img1(gray1);
Mat img2(gray2);
//Detect FAST keypoints and BRIEF features in the first image
FastFeatureDetector detector(50);
BriefDescriptorExtractor descriptorExtractor;
BruteForceMatcher<L1<uchar> > descriptorMatcher;
vector<KeyPoint> keypoints1;
detector.detect( img1, keypoints1 );
Mat descriptors1;
descriptorExtractor.compute( img1, keypoints1, descriptors1 );
/* Detect FAST keypoints and BRIEF features in the second image*/
vector<KeyPoint> keypoints2;
detector.detect( img1, keypoints2 );
Mat descriptors2;
descriptorExtractor.compute( img2, keypoints2, descriptors2 );
vector<DMatch> matches;
descriptorMatcher.match(descriptors1, descriptors2, matches);
if (matches.size()==0)
return;
vector<Point2f> points1, points2;
for(size_t q = 0; q < matches.size(); q++)
{
points1.push_back(keypoints1[matches[q].queryIdx].pt);
points2.push_back(keypoints2[matches[q].trainIdx].pt);
}
//Create the result image
result = cvCreateImage(cvSize(mImage2->width * 2, mImage2->height), 8, 3);
cvZero(result);
//Copy the second image in the result image
cvSetImageROI(result, cvRect(mImage2->width, 0, mImage2->width, mImage2->height));
cvCopy(mImage2, result);
cvResetImageROI(result);
//Create warp image
IplImage* warpImage = cvCloneImage(result);
cvZero(warpImage);
/************************** Is there anything wrong here!? *******************/
//Find homography matrix
Mat H = findHomography(Mat(points1), Mat(points2), 8, 3.0);
CvMat HH = H; //Is this line converted correctly?
//Transform warp image
cvWarpPerspective(mImage1, warpImage, &HH);
//Blend
blend(result, warpImage);
/*******************************************************************************/
cvReleaseImage(&gray1);
cvReleaseImage(&gray2);
cvReleaseImage(&warpImage);
}
OriginalL'auteur Edi | 2011-05-16
Vous devez vous connecter pour publier un commentaire.
C'est ce que je vous suggère d'essayer, dans cet ordre:
1) Utilisation CV_RANSAC option pour homographie. Reportez-vous http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html
2) Essayer d'autres descripteurs, en particulier les EIPD ou VAGUES du bateau avec OpenCV. Pour quelques images RAPIDES ou BRÈVE, les descripteurs ne sont pas assez discriminant. EDIT (Août '12): L'ORB, les descripteurs qui sont courtes, sont très bon et rapide!
3) Essayez de regarder à la matrice d'Homographie (pas à pas en mode de débogage ou de l'imprimer) et voir si elle est conforme.
4) Si ci-dessus ne vous donne pas une idée, essayez de regarder les matchs qui se sont formés. Est-il correspondant à un point dans une image avec un certain nombre de points dans l'autre image? Si donc le problème devrait à nouveau être avec les descripteurs ou le détecteur.
Mon intuition est que c'est les descripteurs (donc 1) ou 2) devrait résoudre le problème).
Laquelle des propositions fonctionné pour vous ?
OriginalL'auteur KMS
Aussi passer à la distance de Hamming à la place de la L1 à distance dans BruteForceMatcher. BREF descripteurs sont censés être comparées à l'aide de Hamming distance.
OriginalL'auteur Rahul Garg
Votre homographie, pourrait calculé sur la base de mauvais matchs et représentent donc une mauvaise allignment.
Je suggère à chemin de la matrice de contrôle supplémentaires de interdependancy entre ses lignes.
Vous pouvez utiliser le code suivant:
OriginalL'auteur DanielHsH