基于ORB的LinearBlend融合

简介: // L14//基于ORB实现线性融合#include "stdafx.h"#include #include #include #include #include #include #include #include #include #include  using namespace st...
img_b390132f880a89f035875d3f280087d1.jpe
// L14
//基于ORB实现线性融合
#include "stdafx.h"
#include <vector>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/calib3d/calib3d.hpp>
 
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
    cv::Mat image1= cv::imread("parliament1.bmp",1);
    cv::Mat image2= cv::imread("parliament2.bmp",1);
    if (!image1.data || !image2.data)
        return 0
    std::vector<cv::KeyPoint> keypoints1, keypoints2;
    //寻找ORB特针点对
    Ptr<DescriptorMatcher> descriptorMatcher;
    // Match between img1 and img2
    vector<DMatch> matches;
    // keypoint  for img1 and img2
    vector<KeyPoint> keyImg1, keyImg2;
    // Descriptor for img1 and img2
    Mat descImg1, descImg2;
    //创建ORB对象
    Ptr<Feature2D> b = ORB::create();
    //两种方法寻找特征点
    b->detect(image1, keyImg1, Mat());
    // and compute their descriptors with method  compute
    b->compute(image1, keyImg1, descImg1);
    // or detect and compute descriptors in one step
    b->detectAndCompute(image2, Mat(),keyImg2, descImg2,false);
    //匹配特征点
    descriptorMatcher = DescriptorMatcher::create("BruteForce");
    descriptorMatcher->match(descImg1, descImg2, matches, Mat());
    Mat index;
    int nbMatch=int(matches.size());
    Mat tab(nbMatch, 1, CV_32F);
    for (int i = 0; i<nbMatch; i++)
    {
        tab.at<float>(i, 0= matches[i].distance;
    }
    sortIdx(tab, index, cv::SORT_EVERY_COLUMN +cv::SORT_ASCENDING);
    vector<DMatch> bestMatches;
    for (int i = 0; i<60; i++)
    {
        bestMatches.push_back(matches[index.at<int>(i, 0)]); 
    }
    Mat result;
    drawMatches(image1, keyImg1, image2, keyImg2, bestMatches, result);
    std::vector<Point2f> obj;
    std::vector<Point2f> scene;
    forint i = 0; i < (int)bestMatches.size(); i++ )
    {    
        obj.push_back( keyImg1[ bestMatches[i].queryIdx ].pt );
        scene.push_back( keyImg2[ bestMatches[i].trainIdx ].pt );
    }
    //直接调用ransac,计算单应矩阵
    Mat H = findHomography( obj, scene, CV_RANSAC );
    //绘制仿射结果
    std::vector<Point2f> obj_corners(4);
    std::vector<Point2f> scene_corners(4);
    obj_corners[0= Point(0,0); 
    obj_corners[1= Point( image1.cols, 0 );
    obj_corners[2= Point( image1.cols, image1.rows ); 
    obj_corners[3= Point( 0, image1.rows );
    perspectiveTransform( obj_corners, scene_corners, H);
    //-- Draw lines between the corners (the mapped object in the scene - image_2 )
    Point2f offset( (float)image1.cols, 0);
    line( result, scene_corners[0+ offset, scene_corners[1+ offset, Scalar(02550), 4 );
    line( result, scene_corners[1+ offset, scene_corners[2+ offset, Scalar( 02550), 4 );
    line( result, scene_corners[2+ offset, scene_corners[3+ offset, Scalar( 02550), 4 );
    line( result, scene_corners[3+ offset, scene_corners[0+ offset, Scalar( 02550), 4 );
    imshow("两图比对", result);//初步显示结果
    //通过透视变换转换到一起
    cv::Mat resultAll;
    cv::warpPerspective(image1, // input image
        resultAll,            // output image
        H,        // homography
        cv::Size(2*image1.cols,image1.rows)); // size of output image
    cv::Mat resultback;
    resultAll.copyTo(resultback);
    // Copy image 1 on the first half of full image
    cv::Mat half(resultAll,cv::Rect(0,0,image2.cols,image2.rows));
    image2.copyTo(half);
    //进行liner的融合
    Mat outImage;//待输出图片 
    resultAll.copyTo(outImage);//图像拷贝
    double dblend = 0.0;
    int ioffset =image2.cols-100;//col的初始定位
    for (int i = 0;i<100;i++)
    {    
        outImage.col(ioffset+i) = image2.col(ioffset+i)*(1-dblend) + resultback.col(ioffset+i)*dblend;
        dblend = dblend +0.01;
    }
    waitKey();
    imshow("融合结果",outImage);
    return 0;
}




目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
8月前
|
机器学习/深度学习 编解码 文件存储
YOLOv8改进 | 融合改进篇 | BiFPN+ RepViT(教你如何融合改进机制)
YOLOv8改进 | 融合改进篇 | BiFPN+ RepViT(教你如何融合改进机制)
937 1
|
8月前
|
机器学习/深度学习 编解码 文件存储
YOLOv5改进 | 融合改进篇 | BiFPN+ RepViT(教你如何融合改进机制)
YOLOv5改进 | 融合改进篇 | BiFPN+ RepViT(教你如何融合改进机制)
1434 1
|
8月前
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
470 0
|
8月前
|
编解码 算法 计算机视觉
YOLO特征融合的原理是怎样的?
YOLO特征融合的原理是怎样的?
|
8月前
|
传感器 机器学习/深度学习 自动驾驶
【多模态融合】CRN 多视角相机与Radar融合 实现3D检测、目标跟踪、BEV分割 ICCV2023
本文介绍使用雷达与多视角相机融合,实现3D目标检测、3D目标跟踪、道路环境BEV分割,它是来自ICCV2023的。CRN,全称是Camera Radar Net,是一个多视角相机-雷达融合框架。 通过融合多视角相机和雷达的特性,生成语义丰富且空间精确的BEV特征图。实现3D物体检测、跟踪和BEV分割任务。
760 1
|
8月前
|
机器学习/深度学习 算法 计算机视觉
YOLOv8改进之C2f模块融合CVPR2023 SCConv
卷积在各种计算机视觉任务中表现出色,但是由于卷积层提取冗余特征,其计算资源需求巨大。虽然过去用于改善网络效率的各种模型压缩策略和网络设计,包括网络剪枝、权重量化、低秩分解和知识蒸馏等。然而,这些方法都被视为后处理步骤,因此它们的性能通常受到给定初始模型的上限约束。而网络设计另辟蹊径,试图减少密集模型参数中的固有冗余,进一步开发轻量级网络模型。
977 0
ORB特征检测
ORB特征检测
74 1
|
算法 计算机视觉
图像特征提取--ORB算法
图像特征提取--ORB算法
130 0
|
机器学习/深度学习 存储 算法
图像特征提取与描述_角点特征03:Fast算法+ORB算法
我们前面已经介绍过几个特征检测器,它们的效果都很好,特别是SIFT和SURF算法,但是从实时处理的角度来看,效率还是太低了。为了解决这个问题,Edward Rosten和Tom Drummond在2006年提出了FAST算法,并在2010年对其进行了修正。
665 0
|
资源调度 算法 机器人
图像特征提取与描述_角点特征02:SIFT算法+SURF算法
前面两节我们介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性,以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使用同样的窗口,就检测不到角点了。
237 0