Я использую OpenCV, и у меня есть проблема.
Когда я делаю 3D панораму, я получаю это первым.
И когда я добавлю следующую фотографию.
Если вы видите, левая часть фотографии исчезает из Панорамы, и я не знаю, почему это происходит.
Вот мой код
int minHessian = 400;
SurfFeatureDetector detector( minHessian );
std::vector< KeyPoint > keypoints_object, keypoints_scene;
detector.detect( gray_image1, keypoints_object );
detector.detect( gray_image2, keypoints_scene );
//-- Step 2: Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor;
Mat descriptors_object, descriptors_scene;
extractor.compute( gray_image1, keypoints_object, descriptors_object );
extractor.compute( gray_image2, keypoints_scene, descriptors_scene );
//-- Step 3: Matching descriptor vectors using FLANN matcher
BFMatcher matcher(NORM_L2,true);
std::vector< DMatch > matches;
matcher.match( descriptors_object, descriptors_scene, matches );
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < matches.size(); i++ )
{ double dist = matches[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
printf("-- Max dist : %f \n", max_dist );
printf("-- Min dist : %f \n", min_dist );
//-- Use only "good" matches (i.e. whose distance is less than 3*min_dist )
std::vector< DMatch > good_matches;
for( int i = 0; i < matches.size(); i++ )
{ if( matches[i].distance < 3*min_dist )
{ good_matches.push_back( matches[i]); }
}
std::vector< Point2f > obj;
std::vector< Point2f > scene;
for( int i = 0; i < good_matches.size(); i++ )
{
//-- Get the keypoints from the good matches
obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt );
scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt );
}
// Find the Homography Matrix
//Stich=2
//Ref = 1
Mat T = (Mat_<double>(3,3) <<
1, 0, image2.cols,
0, 1, image2.rows,
0, 0, 1);
/*Mat T = (Mat_<double>(3,3) <<
1, 0, 0,
0, 1, 0,
0, 0, 1);*/
vector<unsigned char> match_mask;
Mat H = findHomography( scene,obj,match_mask, CV_RANSAC );
// Use the Homography Matrix to warp the images
cv::Mat result;
warpPerspective(image2,result,T*H,cv::Size(image1.cols+image2.cols*2,image1.rows+image2.rows*2));
cv::Mat half(result,cv::Rect(image2.cols,image2.rows,image1.cols,image1.rows));
image1.copyTo(half);
result=deleteBlackZone(result);
imshow( "Result", result );
imwrite("Panorama.jpg",result);
Кто-нибудь знает, как я могу это исправить, и изображение не исчезнет? У кого-нибудь есть код для C ++ функционала для этого? Чтобы увидеть это и посмотреть, что я делаю плохо.
Спасибо за ваше время.
РЕДАКТИРОВАТЬ:
Код deleteBlackZone ()
Mat deleteBlackZone(const Mat &image)
{
Mat resultGray;
Mat result;
image.copyTo(result);
cout<<"Deleting "<< image.channels()<<endl;
cvtColor( image, resultGray, CV_RGB2GRAY );
medianBlur(resultGray,resultGray,3);
Mat resultTh;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
threshold(resultGray,resultTh,1,255,0);
findContours( resultTh, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
Mat dsta= Mat::zeros(image.rows,image.cols, CV_8UC3);
cout<<"Deleteado"<<endl;
Mat besta= Mat(contours[0]);
int max_areaa = -1;
int buenoa=0;
for( int i = 0; i < contours.size(); i++ ) {
/**1
* mosa
* Imagen de destino, los contornos, el numero de contorno, el color del contorno (en este caso es negro para marcarlos)
* la anchura de linea, la union entre lineas, informacion sobre la jerarquia, maximo nivel de dibujo (si fuese mayor
* que 0, dibujaria los contornos que cuelgan de el) y por ultimo el offset
*/
if(contourArea(contours[i])> max_areaa)
{
max_areaa=contourArea(contours[i]);
besta=Mat(contours[i]);
buenoa=i;
cout << i << endl;
}
}
Rect a = boundingRect(besta);
cv::Mat half(result,a);
return half;
/// Encontrar contornos
/*
* Imagen de entrada, conjunto de contornos, vector que contne informacion topologica de la imagen(mismo numero que contornos)
* el modo de recuperacion (en este caso, crea una jerarquia de cotornos anidados), modo de ejecucion (comprime horizontal,
* vertical y diagonalmente los segmentos y deja solo los puntos (por ejemplo, en un rectangulo, el contorno son 4 puntos)
* y por ultimo el offset usado
*/
cout<<"Deleteado"<<endl;
findContours( resultTh, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
Mat dst= Mat::zeros(image.rows,image.cols, CV_8UC3);cout<<"Deleteado"<<endl;
Mat best= Mat(contours[0]);
int max_area = -1;
int bueno=0;
for( int i = 0; i < contours.size(); i++ ) {
/**1
* mosa
* Imagen de destino, los contornos, el numero de contorno, el color del contorno (en este caso es negro para marcarlos)
* la anchura de linea, la union entre lineas, informacion sobre la jerarquia, maximo nivel de dibujo (si fuese mayor
* que 0, dibujaria los contornos que cuelgan de el) y por ultimo el offset
*/
if(contourArea(contours[i]) > max_area)
{
max_area=contourArea(contours[i]);
best=Mat(contours[i]);
bueno=i;
cout << i << endl;
}
}
cout<<"Deleteado"<<endl;
Mat approxCurve;
approxPolyDP(Mat(best),approxCurve,0.01*arcLength(Mat(best),true),true);
cout<<"DeleteadoFFFF"<<endl;
Scalar color= Scalar(255, 255, 255);
cout<<bueno<<endl;
/*for( int i = 0; i < contours.size(); i++ ) {
/**
* Imagen de destino, los contornos, el numero de contorno, el color del contorno (en este caso es negro para marcarlos)
* la anchura de linea, la union entre lineas, informacion sobre la jerarquia, maximo nivel de dibujo (si fuese mayor
* que 0, dibujaria los contornos que cuelgan de el) y por ultimo el offset
*/
/* drawContours( dst, contours, i, color, 2, 8, hierarchy, 0, Point() );
}
//imshow("corregida",dst);*/
//Guardo el mejor contorno
drawContours( dst, contours, bueno, color, 2, 8, hierarchy, 0, Point() );
imwrite("Contorno2.jpg",dst);
exit(1);
return image;
}
Задача ещё не решена.