C++ 如何获取有关cv::Stitcher失败的更多信息

C++ 如何获取有关cv::Stitcher失败的更多信息,c++,opencv,camera-calibration,homography,C++,Opencv,Camera Calibration,Homography,我有两个摄像头,它们在头顶上看着一个正方形的物体,我想拍摄这两个图像,并将它们结合起来,得到一个(大致)代表整个区域的图像 我的两个摄像头的视图如下所示: 左图像的左边缘应与右图像的右边缘缝合,黑色虚线是它们重叠的点 我的第一次尝试是使用本教程中的技术将图像缝合在一起: #包括 #包括 #包括“opencv2/core/core.hpp” #包括“opencv2/features2d/features2d.hpp” #包括“opencv2/highgui/highgui.hpp” #包括“o

我有两个摄像头,它们在头顶上看着一个正方形的物体,我想拍摄这两个图像,并将它们结合起来,得到一个(大致)代表整个区域的图像

我的两个摄像头的视图如下所示:

左图像的左边缘应与右图像的右边缘缝合,黑色虚线是它们重叠的点

我的第一次尝试是使用本教程中的技术将图像缝合在一起:

#包括
#包括
#包括“opencv2/core/core.hpp”
#包括“opencv2/features2d/features2d.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/nonfree/nonfree.hpp”
#包括“opencv2/calib3d/calib3d.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
使用名称空间cv;
无效自述();
/**@主功能*/
int main(int argc,字符**argv)
{
如果(argc!=3)
{readme();返回-1;}
//加载图像
Mat image1=imread(argv[2]);
Mat image2=imread(argv[1]);
matgray_图像1;
matgray_图像2;
//转换为灰度
CVT颜色(图像1、灰色图像1、CV\U RGB2GRAY);
CVT颜色(图像2,灰色图像2,CV\U RGB2GRAY);
imshow(“第一幅图像”,图像2);
imshow(“第二图像”,图像1);
如果(!gray_image1.data | |!gray_image2.data)
{std::cout匹配;
匹配(描述符\对象、描述符\场景、匹配);
双最大距离=0;双最小距离=100;
//--快速计算关键点之间的最大和最小距离
对于(int i=0;i最大距离)最大距离=距离;
}
printf(“--Max dist:%f\n”,Max\u dist);
printf(“--最小距离:%f\n”,最小距离);
//--仅使用“良好”匹配(即距离小于3*min\u dist)
标准::矢量良好匹配;
对于(int i=0;iobj;
std::vector场景;
for(int i=0;i{std::cout尝试使用
cv::Stitcher
这样一种方式,这是将图像彼此扭曲的最简单方式:

#include <iostream>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/stitching/stitcher.hpp>

int main(int argc, char** argv)
{
    cv::Mat img1 = cv::imread("image1.jpg");
    cv::Mat img2 = cv::imread("image2.jpg");

    if (img1.empty() || img2.empty())
    {
        return -1;
    }

    std::vector<cv::Mat> imgs;
    imgs.push_back(img1);
    imgs.push_back(img2);
    // push more images here ...

    cv::Mat panoramic;
    cv::Stitcher stitcher = cv::Stitcher::createDefault(true);
    stitcher.stitch(imgs, panoramic);

    cv::imshow("Result", panoramic);
    cv::waitKey(0);

    return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
cv::Mat img1=cv::imread(“image1.jpg”);
cv::Mat img2=cv::imread(“image2.jpg”);
if(img1.empty()| | img2.empty())
{
返回-1;
}
std::向量imgs;
imgs.推回(img1);
imgs.推回(img2);
//在这里推送更多图片。。。
cv::Mat全景;
cv::Stitcher-Stitcher=cv::Stitcher::createDefault(true);
缝合器。缝合器(imgs,全景);
cv::imshow(“结果”,全景);
cv::waitKey(0);
返回0;
}

尝试使用
cv::Stitcher
下面这样的方法,这是将图像彼此扭曲的最简单方法:

#include <iostream>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/stitching/stitcher.hpp>

int main(int argc, char** argv)
{
    cv::Mat img1 = cv::imread("image1.jpg");
    cv::Mat img2 = cv::imread("image2.jpg");

    if (img1.empty() || img2.empty())
    {
        return -1;
    }

    std::vector<cv::Mat> imgs;
    imgs.push_back(img1);
    imgs.push_back(img2);
    // push more images here ...

    cv::Mat panoramic;
    cv::Stitcher stitcher = cv::Stitcher::createDefault(true);
    stitcher.stitch(imgs, panoramic);

    cv::imshow("Result", panoramic);
    cv::waitKey(0);

    return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
cv::Mat img1=cv::imread(“image1.jpg”);
cv::Mat img2=cv::imread(“image2.jpg”);
if(img1.empty()| | img2.empty())
{
返回-1;
}
std::向量imgs;
imgs.推回(img1);
imgs.推回(img2);
//在这里推送更多图片。。。
cv::Mat全景;
cv::Stitcher-Stitcher=cv::Stitcher::createDefault(true);
缝合器。缝合器(imgs,全景);
cv::imshow(“结果”,全景);
cv::waitKey(0);
返回0;
}

与直接问题无关,但您应该注意,您的教程假设一个摄像头位置拍摄两张照片。您可能不喜欢尝试缝合从不同位置拍摄的照片的结果。哦!我没有意识到这是一个要求。有没有办法识别一对图像中的特征(即使是手动识别)然后得到两幅图像的大致缝合?我用这些测试图像尝试了这段代码,在
cv::DMatch
的析构函数中得到了相同的错误——与直接问题无关,但您应该注意,您的教程假设一个相机位置拍摄两张照片。您可能不喜欢尝试缝合pho的结果从不同的地方拍摄的照片。哦!我不知道这是一个要求。有没有办法在一对图像中识别特征(甚至是手动识别)然后得到两个图像的大致缝合?我用这些测试图像尝试了这段代码,在
cv::DMatch
的析构函数中得到了相同的错误——不幸的是,这给了我相同的错误——它在尝试取消分配缝合器类中的向量时崩溃:(您使用哪个OpenCV版本进行测试?您不混合调试/发布dll吗?我使用的是OpenCV 2.4.11和Visual Studio 2015。我没有混合.dll,据我所知--我实际上开始怀疑是否需要为VS2015重新编译OpenCV不幸的是,这给了我同样的错误--它在尝试取消分配VSI中的向量时崩溃。)Stitcher类的de:(你使用哪个OpenCV版本进行测试?你不混合调试/发布dll吗?我使用的是OpenCV 2.4.11和Visual Studio 2015。据我所知,我没有混合.dll--我实际上开始怀疑是否需要为VS2015重新编译OpenCV