我找到了一些关于通过OpenCV缝合全景图像的基本工作示例.我还在API文档中找到了一些有用的文档,但是我无法通过提供其他信息来了解如何加快处理速度.
在我的例子中,我在一个20x20网格的单个帧中生成一组图像,总共400个图像被拼接成一个大的图像.这在现代PC上花费了大量时间,因此在开发板上可能需要数小时.
有没有办法告诉OpenCV实例有关图像的信息,比如我事先知道所有图像在网格上的相对位置?到目前为止,我看到的唯一API调用是将所有图像无差别地添加到队列中vImg.push_back().
参考
<http://docs.opencv.org/modules/stitching/doc/stitching.html><http://feelmare.blogspot.ca/2013/11/opencv-stitching-example-stitcher-class.html><http://ramsrigoutham.com/2012/11/22/panorama-image-stitching-in-opencv/>所以我正在安装最新版本的OpenCV 3.2.0并且它只是停留在99%(即使我将nproc传递给-j使得它花了很长时间并且我的nproc输出为24)并且我想知道是否有解决方案因为我不想阻止它.我没有收到任何错误:
CUDA 8
Python 3.4.3
OpenCV3.2.0
Ubuntu 14.04
Run Code Online (Sandbox Code Playgroud)
和
[ 98%] Built target opencv_stitching
Scanning dependencies of target opencv_test_stitching
Scanning dependencies of target opencv_perf_stitching
BUILD SUCCESSFUL
Total time: 3 seconds
[ 99%] [ 99%] [ 99%] [ 99%] Building CXX object modules/stitching/CMakeFiles/opencv_test_stitching.dir/test/test_matchers.cpp.o
Building CXX object modules/stitching/CMakeFiles/opencv_test_stitching.dir/test/test_main.cpp.o
Building CXX object modules/stitching/CMakeFiles/opencv_test_stitching.dir/test/ocl/test_warpers.cpp.o
Building CXX object modules/stitching/CMakeFiles/opencv_test_stitching.dir/test/test_blenders.cpp.o
[ 99%] [ 99%] [ 99%] [ 99%] Building CXX object modules/stitching/CMakeFiles/opencv_perf_stitching.dir/perf/perf_estimators.cpp.o
[ 99%] Building CXX object modules/stitching/CMakeFiles/opencv_perf_stitching.dir/perf/perf_stich.cpp.o
[ 99%] Building CXX object modules/stitching/CMakeFiles/opencv_perf_stitching.dir/perf/perf_main.cpp.o
Building …Run Code Online (Sandbox Code Playgroud) 我已经找到了很多关于使用OpenCV进行图像拼接和变形的问题和答案,但我仍然找不到我的问题的答案.
我有两个鱼眼摄像头,我成功校准,因此在两个图像中都消除了失真.
现在我想将那些经过纠正的图像拼接在一起.所以我几乎都遵循这个例子,这也是很多其他拼接问题中提到的: 图像拼接示例
所以我做了Keypoint和Descriptor检测.我找到了匹配并获得了Homography矩阵,因此我可以扭曲其中一个图像,这样可以得到一个非常拉伸的图像.另一张图片保持不变.拉伸是我想要避免的.所以我在这里找到了一个很好的解决方案: 拉伸解决方案.
在幻灯片7上,您可以看到两个图像都被扭曲.我认为这会减少一幅图像的拉伸(在我看来,拉伸将分开,例如50:50).如果我错了请告诉我.
我遇到的问题是我不知道如何扭曲两个图像以使它们适合.我必须计算两个同性恋吗?我是否必须像Rect()或其他东西一样定义参考平面?如何实现幻灯片7所示的变形结果?
为了说清楚,我不是在德累斯顿工业大学学习,所以这只是我在研究时发现的东西.
c++ opencv camera-calibration image-stitching opencv-stitching
我用4台固定式摄像机.相机不会相对移动.我想将他们的视频图像实时拼接成一个视频图像.
我用这个OpenCV 2.4.10和cv:stitcher类,像这样:
// use 4 video-cameras
cv::VideoCapture cap0(0), cap1(1), cap2(2), cap3(3);
bool try_use_gpu = true; // use GPU
cv::Stitcher stitcher = cv::Stitcher::createDefault(try_use_gpu);
stitcher.setWarper(new cv::CylindricalWarperGpu());
stitcher.setWaveCorrection(false);
stitcher.setSeamEstimationResol(0.001);
stitcher.setPanoConfidenceThresh(0.1);
//stitcher.setSeamFinder(new cv::detail::GraphCutSeamFinder(cv::detail::GraphCutSeamFinderBase::COST_COLOR_GRAD));
stitcher.setSeamFinder(new cv::detail::NoSeamFinder());
stitcher.setBlender(cv::detail::Blender::createDefault(cv::detail::Blender::NO, true));
//stitcher.setExposureCompensator(cv::detail::ExposureCompensator::createDefault(cv::detail::ExposureCompensator::NO));
stitcher.setExposureCompensator(new cv::detail::NoExposureCompensator());
std::vector<cv::Mat> images(4);
cap0 >> images[0];
cap1 >> images[1];
cap2 >> images[2];
cap3 >> images[3];
// call once!
cv::Stitcher::Status status = stitcher.estimateTransform(images);
while(true) {
// **lack of speed, even if I use old frames**
// std::vector<cv::Mat> images(4);
//cap0 …Run Code Online (Sandbox Code Playgroud) 我有一些示例代码使用OpenCV(Java包装器)将2个图像拼接在一起.它引用了一个不推荐使用的类"DescriptorExtractor".我在官方网站文档或源代码中找不到任何关于我应该使用的信息.当某些东西被弃用时,我总是很生气,而且它并没有告诉你应该使用什么.
谁能帮我?
我正在使用OpenCV 3.4.1和预构建的Windows库.
该课程的官方文档似乎在这里.
"FeatureDetector"类同样被弃用,同样没有任何关于使用什么的提示.
我正在尝试找到一个简单的算法来裁剪(删除黑色区域)使用openCV Stitcher模块创建的全景图像.
我的想法是计算图像中最内部的黑点,它将定义裁剪区域,如下图所示:

预期的裁剪结果:

我已经尝试了接下来的两种方法,但它们没有按预期裁剪图像:
第一种方法:
void testCropA(cv::Mat& image)
{
cv::Mat gray;
cvtColor(image, gray, CV_BGR2GRAY);
Size size = gray.size();
int type = gray.type();
int left = 0, top = 0, right = size.width, bottom = size.height;
cv::Mat row_zeros = Mat::zeros(1, right, type);
cv::Mat col_zeros = Mat::zeros(bottom, 1, type);
while (countNonZero(gray.row(top) != row_zeros) == 0) { top++; }
while (countNonZero(gray.col(left) != col_zeros) == 0) { left++; }
while (countNonZero(gray.row(bottom-1) != row_zeros) == 0) { bottom--; }
while (countNonZero(gray.col(right-1) != col_zeros) == …Run Code Online (Sandbox Code Playgroud) 我正在尝试减少拼接算法的计算时间.我得到了一些我想按照定义的顺序cv::stitcher.stitch()拼接的图像,但似乎功能试图将每个图像与其他所有图像拼接在一起.
我觉得我可能会在OpenCV Stitcher的参数中找到解决方案.如果没有,也许我必须修改功能或尝试其他方法来减少计算时间.但由于我几乎是初学者,我不知道如何.我知道使用GPU可能是一种可能性,但我现在还没有在Ubuntu上运行CUDA.
如果你能给我一些建议,那就太好了!
OpenCV Stitcher模块的参数:
Stitcher Stitcher::createDefault(bool try_use_gpu) {
Stitcher stitcher;
stitcher.setRegistrationResol(0.6);
stitcher.setSeamEstimationResol(0.1);
stitcher.setCompositingResol(ORIG_RESOL);
stitcher.setPanoConfidenceThresh(1);
stitcher.setWaveCorrection(true);
stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ);
stitcher.setFeaturesMatcher(new detail::BestOf2NearestMatcher(try_use_gpu));
stitcher.setBundleAdjuster(new detail::BundleAdjusterRay());
Run Code Online (Sandbox Code Playgroud)
来自stitcher.cpp:
https://code.ros.org/trac/opencv/browser/trunk/opencv/modules/stitching/src/stitcher.cpp?rev=7244
我最近一直在尝试在 OpenCV 中拼接由四轴飞行器拍摄的低质量、低分辨率 (320x180) 图像。这是我得到的:
http://postimg.org/gallery/1rqsycyk/
拍摄的照片几乎是最低点,并且您可以看到重叠很多。每个镜头之间都有一个平移,我试图将物体放在地面上,使场景几乎保持平面,以免干扰单应性的要求。无论如何,在拼接过程中没有考虑到很多图片。
这里再举一个例子,(只有三张图片拼接在一起):
http://postimg.org/gallery/1wpt3lmo/
我正在使用 Surf Featuredetector 并认为图像的低质量不适合它,但我不确定。
这是我使用的代码,我在一个类似的问题OpenCV 非旋转图像拼接中找到了它,并决定使用它,因为它比我的工作得更好:
Mat pano;
Stitcher stitcher = Stitcher::createDefault(false);
stitcher.setWarper(new PlaneWarper());
stitcher.setFeaturesFinder(new detail::SurfFeaturesFinder(1000,3,4,3,4));
stitcher.setRegistrationResol(0.1);
stitcher.setSeamEstimationResol(0.1);
stitcher.setCompositingResol(1);
stitcher.setPanoConfidenceThresh(1);
stitcher.setWaveCorrection(true);
stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ);
stitcher.setFeaturesMatcher(new detail::BestOf2NearestMatcher(false,0.3));
stitcher.setBundleAdjuster(new detail::BundleAdjusterRay());
Stitcher::Status status = Stitcher::ERR_NEED_MORE_IMGS;
try{
status = stitcher.stitch(picturesTaken, pano);
}
catch(cv::Exception e){}
Run Code Online (Sandbox Code Playgroud)
我的另一个猜测是手动进行拼接过程,而不是使用 Stitcher 类,但我不确定它是否会发生很大变化。所以问题是:尽管图像质量低,我怎样才能使拼接过程更加健壮?另外:定义 ROI 是否仅对性能或实际拼接的机会产生影响?
我想深入缝合.我在用cv::detail.
我试着效仿这个例子:
我粗略地了解拼接管道.
有一个matchesGraphAsString()返回图形的函数.我想知道它是如何计算这个图的.此外,在这种情况下,置信区间的限定是什么.
输出采用DOT格式,示例图如下
graph matches_graph{
"15.jpg" -- "13.jpg"[label="Nm=75, Ni=50, C=1.63934"];
"15.jpg" -- "12.jpg"[label="Nm=47, Ni=28, C=1.26697"];
"15.jpg" -- "14.jpg"[label="Nm=149, Ni=117, C=2.22011"];
"11.jpg" -- "13.jpg"[label="Nm=71, Ni=52, C=1.77474"];
"11.jpg" -- "9.jpg"[label="Nm=46, Ni=37, C=1.69725"];
"11.jpg" -- "10.jpg"[label="Nm=87, Ni=73, C=2.14076"];
"9.jpg" -- "8.jpg"[label="Nm=122, Ni=99, C=2.21973"];
}
Run Code Online (Sandbox Code Playgroud)
是什么label,Nm和Ni这里的意思?官方文件似乎缺乏这些细节.
我的项目中有一个函数可以拼接,功能很好,很简单:
Mat output(m_Img, true), pano; // a panaoramic image
bool try_use_gpu = true;
Stitcher iSticher = Stitcher::createDefault(try_use_gpu);
// Set Feature finder to be ORB
iSticher.setFeaturesFinder(new detail::OrbFeaturesFinder());
try{
Stitcher::Status status = iSticher.stitch(Imgs, pano);
if (status != Stitcher::OK)
{
LOG("Error stitching - Code: %d", int(status));
return -1;
}
}
catch(exception e)
{
LOG("Cannot Stitch Image,%s",e.what());
}
Run Code Online (Sandbox Code Playgroud)
代码运作良好,我能够很好地缝合图像.唯一的问题是,当我想部署我的代码时,我意识到我必须使用非自由的dll.否则,.exe将无法运行.我的问题是:为了使用Stitcheropencv中的类,这意味着你必须支付,即使你没有使用SURF或SIFT算法?有没有办法在不使用"nonfree dlls"的情况下做到这一点?注意:我正在使用opencv 2.4.2.编辑:我也用它测试过OpenCV 2.4.11
我想知道OpenCV 的拼接(http://docs.opencv.org/modules/stitching/doc/stitching.html)模块是否能够将从平行运动的摄像机拍摄的图像拼接到飞机上被拍照?
我知道通常所有的全景拼接工具都假设摄像机的中心是固定的,而摄像机只能进行平移或俯仰等运动.
我在想是否可以使用这个模块缝合从平行于平面移动的相机拍摄的图像.这个想法是创建一个地面的全景地图.
问候
opencv image-processing panoramas image-stitching opencv-stitching
您能否给我一些提示,我在哪里可以找到 Python Stitcher 类的详细文档?
我能够找到示例并实现它们,但我想更多地了解这个类及其功能。