Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 比较和组合c+中的两个图像+;使用开放式cv_C++_Opencv_Image Processing_Computer Vision_Match - Fatal编程技术网

C++ 比较和组合c+中的两个图像+;使用开放式cv

C++ 比较和组合c+中的两个图像+;使用开放式cv,c++,opencv,image-processing,computer-vision,match,C++,Opencv,Image Processing,Computer Vision,Match,我有两张照片是从两个相邻的照相机上拍摄的。照片几乎相同,但其中一张照片中有一些雨滴,我需要在最后将这两张照片比较并合并到同一张图像中(当然排除了雨滴),结果是 事实上,我使用了很多我在网上找到的方法,但我没有得到我需要的结果。首先,我试图找到所有的对应点,我找到了很多对应点,然后,我试图消除所有的“坏”匹配,最后只有“好”点。我用过 其次,我使用OpenCV库来了解这些点从一个图像到另一个图像的转换,不幸的是,我得到了一个非常错误的结果。(我想既然我有了点和它们的坐标,我现在需要知道矩阵M本身)

我有两张照片是从两个相邻的照相机上拍摄的。照片几乎相同,但其中一张照片中有一些雨滴,我需要在最后将这两张照片比较并合并到同一张图像中(当然排除了雨滴),结果是

事实上,我使用了很多我在网上找到的方法,但我没有得到我需要的结果。首先,我试图找到所有的对应点,我找到了很多对应点,然后,我试图消除所有的“坏”匹配,最后只有“好”点。我用过

其次,我使用OpenCV库来了解这些点从一个图像到另一个图像的转换,不幸的是,我得到了一个非常错误的结果。(我想既然我有了点和它们的坐标,我现在需要知道矩阵M本身)。 这是我试过的代码,如果它写得很好,我很抱歉,因为我是一个新手,这是我第一次做这种工作

vector<KeyPoint> keypoints1;
vector<KeyPoint> keypoints2;
Mat descriptors1, descriptors2;
cv::Ptr<cv::AKAZE> akaze = cv::AKAZE::create();
akaze->detectAndCompute(Src1, cv::Mat(), keypoints1, descriptors1);
akaze->detectAndCompute(Src2, cv::Mat(), keypoints2, descriptors2);

vector<vector<cv::DMatch>> knnmatch_points;
cv::BFMatcher match(cv::NORM_HAMMING);
match.knnMatch(descriptors1, descriptors2, knnmatch_points, 2);
const double match_par = 0.4; 
vector<cv::DMatch> goodMatch;
vector<cv::Point2f> match_point1;
vector<cv::Point2f> match_point2;
for (size_t i = 0; i < knnmatch_points.size(); ++i) {
  double distance1 = knnmatch_points[i][0].distance;
  double distance2 = knnmatch_points[i][1].distance;
  if (distance1 <= distance2 * match_par) {
    goodMatch.push_back(knnmatch_points[i][0]);
    match_point1.push_back(keypoints1[knnmatch_points[i][0].queryIdx].pt);
    match_point2.push_back(keypoints2[knnmatch_points[i][0].trainIdx].pt);
...
    srcTri[i] = Point2f(keypoints1[knnmatch_points[i][0].queryIdx].pt);
    dstTri[i] = Point2f(keypoints2[knnmatch_points[i][0].queryIdx].pt);

  }
}
cv::Mat masks;
cv::Mat H = cv::findHomography(match_point1, match_point2, masks, cv::RANSAC, 3);
vector<cv::DMatch> inlinerMatch;
for (size_t i = 0; i < masks.rows; ++i) {
  uchar *inliner = masks.ptr<uchar>(i);
  if (inliner[0] == 1) {
    inlinerMatch.push_back(goodMatch[i]);
  }
}
warp_mat = getAffineTransform(srcTri, dstTri);
warpAffine(Src2, warp_dst, warp_mat, warp_dst.size());
namedWindow(warp_window, WINDOW_AUTOSIZE);
imshow(warp_window, warp_dst);  
向量关键点1;
向量关键点2;
Mat描述符1,描述符2;
cv::Ptr akaze=cv::akaze::create();
akaze->detectAndCompute(Src1,cv::Mat(),keypoints1,描述符1);
akaze->detectAndCompute(Src2,cv::Mat(),keypoints2,描述符2);
向量knnu点;
cv::bMatcher匹配(cv::NORM_HAMMING);
匹配。knnMatch(描述符1,描述符2,knnMatch_点,2);
常数双匹配_par=0.4;
矢量匹配;
向量匹配_点1;
向量匹配_点2;
对于(size_t i=0;i如果(距离1),你应该编辑你的帖子,添加测试图像和结果图像,以理解什么是“我得到了一个非常错误的结果”。这样人们可以给你更好的想法和建议。如果你不提供图像和结果数据,你就不能指望得到帮助。而且,如果两张图像显示的都一样,你想做的就是去掉雨滴,为什么不直接使用没有雨滴的图像呢?我的意思是,从你的帖子中我不太明白为什么你需要两个摄像头。你认为呢你的意思是合并并比较两幅图像?这有什么目的?你能解释一下为什么在
warp\u mat=getAffineTransform(srcTri,dstTri)中使用srcTri和dstTri吗;
而不是goodMatch匹配?您能解释一下为什么使用仿射变换而不是透视变换吗?您应该编辑您的帖子,添加测试图像和结果图像,以理解什么是“我得到了一个非常错误的结果”。这样人们可以给你更好的想法和建议。如果你不提供图像和结果数据,你就不能指望得到帮助。而且,如果两张图像显示的都一样,你想做的就是去掉雨滴,为什么不直接使用没有雨滴的图像呢?我的意思是,从你的帖子中我不太明白为什么你需要两个摄像头。你认为呢你的意思是合并并比较两幅图像?这有什么目的?你能解释一下为什么在
warp\u mat=getAffineTransform(srcTri,dstTri);
中使用srcTri和dstTri而不是goodMatch匹配吗?你能解释一下为什么使用affinetransform而不是透视变换吗?