基于opencv的图像融合(代码片段)

cfox cfox     2022-12-03     201

关键词:

 

版本

由于每个版本的代码偏差都比较大,这里是基于opencv 3.4.5版本的开发

https://github.com/opencv/opencv/releases/tag/3.4.5

https://github.com/opencv/opencv_contrib/releases/tag/3.4.5

编译命令:

cmake -DOPENCV_ENABLE_NONFREE=ON -DBUILD_EXAMPLES=ON -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.5/modules ..

  ./bin/example_cpp_stitching --try_use_gpu yes --mode panorama ./image_left-1585642221.jpg ./image_wide-1585642221.jpg image_right-1585642221.jpg

代码样例

特征点查看代码样例

#include <iostream>
#include <vector>
#include "opencv2/core.hpp"
#ifdef HAVE_OPENCV_XFEATURES2D
#include "opencv2/highgui.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/xfeatures2d.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv/cv.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/calib3d.hpp>
using namespace cv;
using namespace cv::xfeatures2d;
using std::cout;
using std::endl;
int main( int argc, char* argv[] )

    CommandLineParser parser( argc, argv, "@input | box.png | input image" );
    Mat img1 = imread(argv[1], IMREAD_GRAYSCALE );
    Mat img2 = imread(argv[2], IMREAD_GRAYSCALE );
    if ( img1.empty() )
    
        cout << "Could not open or find the image!
" << endl;
        cout << "Usage: " << argv[0] << " <Input image>" << endl;
        return -1;
    
    Mat wide = imread("image_wide.png", IMREAD_GRAYSCALE );
    //-- Step 1: Detect the keypoints using SURF Detector
    int minHessian = 400;
    Ptr<SURF> detector = SURF::create( minHessian );
    std::vector<KeyPoint> keypoints1;
    std::vector<KeyPoint> keypoints2;
    detector->detect(img2, keypoints2);
    detector->detect(img1, keypoints1);

    Ptr<SURF> extractor = SURF::create();
    Mat descriptors1, descriptors2;
    extractor->compute(img1, keypoints1, descriptors1);
    extractor->compute(img2, keypoints2, descriptors2);

    //BFMatcher<L2<float> > matcher;
    DescriptorMatcher* matcher = new BFMatcher(NORM_L2,false);
    std::vector<DMatch> matches;
    matcher->match(descriptors1, descriptors2, matches);

    namedWindow("matches", 1);
    Mat img_matches;
    drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
    imshow("matches", img_matches);
    waitKey(0);

    //-- Draw keypoints
    Mat img_keypoints;
    drawKeypoints(img1, keypoints1, img_keypoints );
    //-- Show detected (drawn) keypoints
    imshow("SURF Keypoints", img_keypoints );
    waitKey();
    return 0;

#else
int main()

    std::cout << "This tutorial code needs the xfeatures2d contrib module to be run." << std::endl;
    return 0;

#endif

 

融合测试命令

./bin/example_cpp_stitching_detailed a0.jpg a1.jpg a2.jpg  --features orb --save_graph graph.dot --conf_thresh 0.5

 

H264 数据

https://blog.csdn.net/oldmtn/article/details/46742555

https://github.com/hirorogithub/ffmpeg_sample-H264_to_cv-Mat/blob/master/H264Decoder.cpp

https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples

 

遇到问题

# 编译报错
# fatal error: boostdesc_bgm.i: No such file or directory
# https://github.com/opencv/opencv_contrib/issues/1301
# 文件列表见目录
# opencv_contrib/modules/xfeatures2d/cmake/download_boostdesc.cmake 
#### 如果可以通过curl命令下载
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_lbgm.i > 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_lbgm.i 
#### 可以直接访问网址下载

# fatal error: vgg_generated_120.i: No such file or directory
# opencv_contrib/modules/xfeatures2d/cmake/download_vgg.cmake
# 下载完成后拷贝到目录 opencv_contrib
/modules/xfeatures2d/src/

 

# 编译报错
# fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory
# https://github.com/opencv/opencv_contrib/issues/1534
# 修改opencv
-3.4.5/CMakeLists.txt 增加下行 INCLUDE_DIRECTORIES("/home/xxxx/opencv/opencv_contrib-3.4.5/modules/xfeatures2d/include") # 重新执行cmake命令

 

参考文档

https://docs.opencv.org/3.0-beta/doc/user_guide/ug_features2d.html

https://www.jb51.net/article/154643.htm

https://docs.opencv.org/trunk/d1/d46/group__stitching.html

https://docs.opencv.org/3.4/d2/dfd/samples_2cpp_2filestorage_8cpp-example.html#_a11

youcans的opencv例程200篇188.基于拉普拉斯金字塔的图像融合(代码片段)

...nCV例程200篇总目录-202205更新【youcans的OpenCV例程200篇】188.基于拉普拉斯金字塔的图像融合图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层... 查看详情

youcans的opencv例程200篇190.基于图像分割的图像融合(代码片段)

...nCV例程200篇总目录-202205更新【youcans的OpenCV例程200篇】190.基于图像分割的图像融合两张图像直接进行加法运算后图像的颜色会改变,通过加权加法实现图像混合后图像的透明度会改变,都不能实现图像的叠加。实现图像... 查看详情

opencv图像无缝融合-seamlessclone介绍与使用(附python/c++源码)(代码片段)

导读本期将介绍并演示OpenCV使用seamlessClone实现图像无缝融合效果。介绍seamlessClone是OpenCV3后添加的函数,使用此函数可以轻松将一幅图像中的指定目标复制后粘贴到另一幅图像中,并自然的融合。函数说明:参数:src... 查看详情

opencv高手勿入!半小时学会基本操作图像裁剪融合(代码片段)

【OpenCV】高手勿入!半小时学会基本操作4概述图像裁剪数值计算图像融合概述OpenCV是一个跨平台的计算机视觉库,支持多语言,功能强大.今天小白就带大家一起携手走进OpenCV的世界.(第4篇)图像裁剪cv2.resize能帮助我们读图像进... 查看详情

图像融合基于matlab多尺度奇异值分解图像融合含matlab源码2040期(代码片段)

...0c;本文设计了如图2所示的去雾算法流程。首先,使用基于最小二乘方法计算出更加精确的偏振信息,改善了以往偏振信息计算不准确的问题。然后,分别使用基于高斯滤波的去雾方法以及基于Stokes矢量的去雾方法处... 查看详情

图像融合基于matlabdct域多焦点图像融合含matlab源码1973期(代码片段)

一、基于DCT变换的图像融合算法简介在图像融合过程中,最主要的就是如何提取低高频系数以及低高频系数的融合准则。基于DCT变换的图像融合算法原理如图2所示。图2DCT融合算法原理算法步骤如下。步骤1精确配准待融合的源图... 查看详情

opencv小项目:图像融合(泊松融合—possionblending)(代码片段)

原理太多了,看这些博客吧主要参考博客1:http://blog.csdn.net/hjimce/article/details/45716603主要参考博客2:http://blog.csdn.net/wd1603926823/article/details/49867069主要参考博客3:http://blog.csdn.net/baimafujinji/article/detai 查看详情

图像融合基于matlab增强随机游走算法多焦点图像融合含matlab源码1975期(代码片段)

一、增强随机游走算法图像融合简介1引言红外图像与可见光图像具有很多互补的特性。红外传感器通过捕捉物体的热辐射成像,受光线、天气等条件的影响较小,且能够识别出伪装、遮挡下的目标,但红外传感器的... 查看详情

图像融合基于matlab导向滤波图像融合含matlab源码1959期(代码片段)

...方式1:完整代码已上传我的资源:【图像融合】基于matlab导向滤波图像融合【含Matlab源码1959期】获取代码方式2:通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。备注:订阅... 查看详情

opencv图像基本操作——读取显示截取图像属性颜色通道边界填充图像融合(代码片段)

引言我们都会有一个疑惑:计算机眼中的图像长什么样子呢?首先拿来一张图片分割成无数个小格,每一个小格叫做像素点,计算机中的图像是由像素点构成的像素矩阵,像素点构成它的每一个值都是在0-255之... 查看详情

图像融合基于matlabgui高斯金字塔+拉普拉斯金字塔彩色图像融合含matlab源码1506期(代码片段)

一、区域分割图像融合简介图像的分解对源图像进行融合时,首先对图像进行分解,利用拉普拉斯金字塔分解,先对图像进行高斯金字塔分解,然后再进行拉普拉斯金字塔分解。1高斯金字塔分解记源图像为G0,G0即为高斯金字塔最底层,... 查看详情

图像融合基于matlabgui高斯金字塔+拉普拉斯金字塔彩色图像融合含matlab源码1506期(代码片段)

一、区域分割图像融合简介图像的分解对源图像进行融合时,首先对图像进行分解,利用拉普拉斯金字塔分解,先对图像进行高斯金字塔分解,然后再进行拉普拉斯金字塔分解。1高斯金字塔分解记源图像为G0,G0即为高斯金字塔最底层,... 查看详情

图像融合基于matlab对比度增强结合多尺度边缘保持分解红外与可见光图像融合含matlab源码1886期(代码片段)

一、对比度增强结合多尺度边缘保持分解红外与可见光图像融合简介1引言夜视成像技术在军事与执法领域,如监控,侦查,情报搜集和安保等方面有着重要应用。不同类型的夜视成像传感器在记录同一场景时,在... 查看详情

图像融合基于matlab高斯金字塔+拉普拉斯金字塔彩色水下图像融合含matlab源码1629期(代码片段)

一、区域分割图像融合简介图像的分解对源图像进行融合时,首先对图像进行分解,利用拉普拉斯金字塔分解,先对图像进行高斯金字塔分解,然后再进行拉普拉斯金字塔分解。1高斯金字塔分解记源图像为G0,G0即为高斯金字塔最底层,... 查看详情

图像融合基于matlab遗传算法图像融合含matlab源码1624期(代码片段)

一、遗传算法图像融合简介理论知识参考:基于遗传算法优化的稀疏表示图像融合算法二、部分源代码%遗传算法主程序%Name:genmain05.mclearq=imread('A.tif');%%%%读取图像q2=imread('B.tif');figure,imshow(q);%%%显示图像figure,... 查看详情

图像融合基于matlab对比度和结构提取多模态解剖图像融合含matlab源码1539期(代码片段)

一、图像融合简介应用多模态图像的配准与融合技术,可以把不同状态的医学图像有机地结合起来,为临床诊断和治疗提供更丰富的信息。介绍了多模态医学图像配准与融合的概念、方法及意义。最后简单介绍了小波变换分析方法... 查看详情

图像融合基于matlabihs变换与自适应区域特征遥感图像融合含matlab源码1636期(代码片段)

...代码方式1:完整代码已上传我的资源:【图像融合】基于matlabIHS变换与自适应区域特征遥感图像融合【含Matlab源码1636期】获取代码方式2:通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代... 查看详情

opencv实战——基于grabcut算法的图像分割(代码片段)

OpenCV实战——基于GrabCut算法的图像分割1.GrabCut算法2.图像分割实战3.完整代码相关链接1.GrabCut算法在OpenCV策略设计模式一节中,我们已经了解了颜色信息如何用于将图像分割成与场景特定元素相对应的区域。每类对象通常具... 查看详情