我已经计算出单应性,取出了透视变换.我能够在一个窗口中显示两个图像,但无法合并它们.这是我的示例图像 - >


我正在使用此代码的代码 - >
cv::warpPerspective(image2,warpresult2,homography,cv::Size(2*image2.cols,image2.rows));
Mat imgResult(image1.rows,2*image1.cols,image1.type());
Mat roiImgResult_Left = imgResult(Rect(0,0,image1.cols,image1.rows));
Mat roiImgResult_Right = imgResult(Rect(image1.cols,0,image2.cols,image2.rows));
Mat roiImg1 = image1(Rect(0,0,image1.cols,image1.rows));
Mat roiImg2 = warpresult2(Rect(0,0,image2.cols,image2.rows));
roiImg1.copyTo(roiImgResult_Left); //Img1 will be on the left of imgResult
roiImg2.copyTo(roiImgResult_Right); //Img2 will be on the right of imgResult
imshow("Finalimg",imgResult);
imwrite("C:\\OpenCv_Projects\\outputimage.jpg",imgResult);
cvWaitKey(0);
Run Code Online (Sandbox Code Playgroud)
我认为问题出在我给予roiImgResult_right的坐标中.
输出图像是 - >
如你所见,图像没有正确合并,右侧有黑色区域.如何删除它?
opencv image-processing computer-vision visual-c++ image-stitching
我找到了一些关于通过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拼接器类来拼接立体设置中的多个帧,其中两个摄像机都不移动.在跨多个帧运行时,我的拼接结果很差.我尝试了几种不同的方法,我将在这里解释一下.
运用 stitcher.stitch( )
给定一对立体视图,我为一些帧运行了以下代码(VideoFile是OpenCV VideoCapture对象的自定义包装器):
VideoFile f1( ... );
VideoFile f2( ... );
cv::Mat output_frame;
cv::Stitcher stitcher = cv::Stitcher::createDefault(true);
for( int i = 0; i < num_frames; i++ ) {
currentFrames.push_back(f1.frame( ));
currentFrames.push_back(f2.frame( ));
stitcher.stitch( currentFrames, output_mat );
// Write output_mat, put it in a named window, etc...
f1.next_frame();
f2.next_frame();
currentFrames.clear();
}
Run Code Online (Sandbox Code Playgroud)
这给每个帧提供了非常好的结果,但由于参数估计放在视频中的每个帧,您可以看到参数略有不同的拼接的小差异.
使用estimateTransform( )&composePanorama( )
为了解决上述方法的问题,我决定尝试仅在第一帧上估计参数,然后用于composePanorama( )缝合所有后续帧.
for( int i = 0; i < num_frames; i++ ) {
currentFrames.push_back(f1.frame( )); …Run Code Online (Sandbox Code Playgroud) Android 4.3/4.4下的"球体模式"下的相机应用程序可以将来自不同方向的照片拼接成一个球形全景,质量非常好.
结果图:
我要做的是为iPad实现具有完全相同功能的应用程序.
我尝试了两种方法:
OpenCV 2.4.8提供了一个图像拼接管道,乍一看似乎非常有前途.但是,它有两个问题:
管道处理无序输入照片,据我所知它只使用图像特征匹配来定位照片之间的几何关系,并且当空白照片(例如白墙,蓝天)上的图像特征提取失败时,管道表现不佳.但是,iPad可以提供每张拍摄照片的任意空间方向数据(虽然有噪音),但我不知道如何在OpenCV拼接管道中使用这些数据.
我无法找到一种生成180x360度全景图的方法,就像PhotoSphere使用此管道一样.向所有方向上的照片馈送管道仅产生具有弯曲图像边界的大型全景图.
我也尝试过PanoTools/Hugin lib,虽然这个lib支持预定义的照片方向,结果非常差且不稳定.此外,我尝试在Google Play上使用Focal(beta)应用,其球体模式也基于PanoTools/Hugin,他们的结果(在球体模式下)似乎并不比我们的好.
我的问题:
我注意到,在Google地图页面中,您可以获得一个"嵌入"链接以放入iframe并在浏览器中加载地图.(这里没有新闻)
图像大小可以调整到非常大,所以我有兴趣将单个大图像作为单个.PNGs.
更具体地说,我想从边界框(右上角和左下角坐标)定义一个矩形区域,并获得具有适当缩放系数的相应图像.
但我的问题是:如何使用Python将此地图的"像素内容"作为图像对象?
(我的理由是:如果浏览器可以获取并呈现这样的图像内容,那么Python也应该能够做到这一点).
编辑:这是显示我的示例地图的HTML文件的内容:
<iframe
width="2000"
height="1500"
frameborder="0"
scrolling="yes"
marginheight="0"
marginwidth="0"
src="http://maps.google.com.br/maps?hl=pt-BR&ll=-30.027489,-51.229248&spn=1.783415,2.745209&z=10&output=embed"/>
Run Code Online (Sandbox Code Playgroud)
编辑:我按照Ned Batchelder的建议做了,并urllib.urlopen()使用src上面iframe 的地址读取了一个电话的内容.结果是很多javascript代码,我认为这与Google Maps JavaScript API有关.所以,问题依然存在:为了获得地图图像,我怎样才能从Python中的所有这些东西中做一些有用的东西?
编辑:此链接似乎包含一些关于Google地图如何拼贴地图的非常相关的信息:http: //www.codeproject.com/KB/scrapbook/googlemap.aspx
您已经看过很多教程如何使用两张照片进行简单的图像拼接,这没有问题.
但是当我想要制作4-6张或更多图像的全景图时该怎么办?
我有代码,其中包含图像文件列表(图像按顺序从序列中的第一个图像到最后一个图像).然后,对于每个图像,我计算SIFT特征描述符.但后来我陷入困境,对于两个图像,我将使用FLANN kd-tree设置匹配器并找到图像之间的匹配并计算Homography.与本教程相似http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html#py-feature-homography
但是我没有在最后显示特征点之间的界限,而是使用这个/sf/answers/1424888181/函数从2张图像制作全景图.但是当我想将第三张和第四张图像添加到全景图时,我不知道该怎么做.
编辑:
从答案中我试图实现我的图像拼接脚本来计算图像序列中彼此相邻的图像之间的单应矩阵.所以,如果我有I1 I2 I3和I4,我现在有H_12,H_23和H_34.然后我开始使用H_12拼接I1和I2.然后我想找到累积的单应性来将I3缝合到当前的全景图上.我将H_13 = H_12*H_23并将图像3缝合到当前全景图像,但是在我的全景图像中我得到非常明显的间隙,当缝合下一个图像时,它的间隙更大,图像非常拉伸.这是我的代码http://pastebin.com/dQjhE5VD
任何人都可以告诉我,如果我使用正确的方法,或者有人发现错误或看到我做错了什么.
我是OpenCV的新手,我已经开始深入研究它了.但我需要一些帮助.
所以我想结合这两个图像:
我希望2个图像沿着它们的边缘匹配(暂时忽略图像的正确部分)
谁能指点我正确的方向?我试过使用这个findTransformECC功能.这是我的实现:
cv::Mat im1 = [imageArray[1] CVMat3];
cv::Mat im2 = [imageArray[0] CVMat3];
// Convert images to gray scale;
cv::Mat im1_gray, im2_gray;
cvtColor(im1, im1_gray, CV_BGR2GRAY);
cvtColor(im2, im2_gray, CV_BGR2GRAY);
// Define the motion model
const int warp_mode = cv::MOTION_AFFINE;
// Set a 2x3 or 3x3 warp matrix depending on the motion model.
cv::Mat warp_matrix;
// Initialize the matrix to identity
if ( warp_mode == cv::MOTION_HOMOGRAPHY )
warp_matrix = cv::Mat::eye(3, 3, CV_32F);
else
warp_matrix = cv::Mat::eye(2, 3, CV_32F);
// …Run Code Online (Sandbox Code Playgroud) 我想在Visual Studio 2008上使用OpenCV 2.3.1实时拼接来自2个或更多(当前可能是3或4个)相机的图像.
但是,我很好奇它是如何完成的.
最近我研究了一些基于特征的图像拼接方法.
其中大多数至少需要以下步骤:
1.特征检测2.特征匹配3.Finding Homography 4.目标图像转换为参考图像等
现在我阅读的大多数技术只处理"ONCE"图像,而我希望它处理从几个摄像头捕获的一系列图像,我希望它是"实时".
到目前为止,它可能仍然令人困惑.我正在描述细节:
将3个摄像机放在不同的角度和位置,同时每个摄像机必须与相邻的摄像机重叠,以构建实时视频拼接.
我想要做的是与以下链接中的内容类似,其中使用了ASIFT.
http://www.youtube.com/watch?v=a5OK6bwke3I
我试图咨询该视频的所有者,但我没有收到他的回复:(.
我可以使用图像拼接方法来处理视频拼接吗?视频本身由一系列图像组成,所以我想知道这是否可行.但是,无论您使用哪种特征检测器(SURF,SIFT,ASIFT等),检测特征点似乎都非常耗时.这让我怀疑进行实时视频拼接的可能性.
我已经找到了很多关于使用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) image-stitching ×10
opencv ×7
c++ ×5
algorithm ×1
c ×1
google-maps ×1
image ×1
opencv3.0 ×1
panoramas ×1
photosphere ×1
python ×1
video ×1
visual-c++ ×1