我正在使用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;
}