基于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
目录
相关文章
|
2月前
|
机器学习/深度学习 编解码 文件存储
YOLOv8改进 | 融合改进篇 | BiFPN+ RepViT(教你如何融合改进机制)
YOLOv8改进 | 融合改进篇 | BiFPN+ RepViT(教你如何融合改进机制)
208 1
|
2月前
|
机器学习/深度学习 编解码 文件存储
YOLOv5改进 | 融合改进篇 | BiFPN+ RepViT(教你如何融合改进机制)
YOLOv5改进 | 融合改进篇 | BiFPN+ RepViT(教你如何融合改进机制)
107 1
|
1月前
|
传感器 机器学习/深度学习 自动驾驶
【多模态融合】CRN 多视角相机与Radar融合 实现3D检测、目标跟踪、BEV分割 ICCV2023
本文介绍使用雷达与多视角相机融合,实现3D目标检测、3D目标跟踪、道路环境BEV分割,它是来自ICCV2023的。CRN,全称是Camera Radar Net,是一个多视角相机-雷达融合框架。 通过融合多视角相机和雷达的特性,生成语义丰富且空间精确的BEV特征图。实现3D物体检测、跟踪和BEV分割任务。
52 1
|
2月前
|
机器学习/深度学习 固态存储 算法
目标检测的福音 | 如果特征融合还用FPN/PAFPN?YOLOX+GFPN融合直接起飞,再涨2个点
目标检测的福音 | 如果特征融合还用FPN/PAFPN?YOLOX+GFPN融合直接起飞,再涨2个点
78 0
|
3月前
|
机器学习/深度学习 算法 计算机视觉
YOLOv8改进之C2f模块融合CVPR2023 SCConv
卷积在各种计算机视觉任务中表现出色,但是由于卷积层提取冗余特征,其计算资源需求巨大。虽然过去用于改善网络效率的各种模型压缩策略和网络设计,包括网络剪枝、权重量化、低秩分解和知识蒸馏等。然而,这些方法都被视为后处理步骤,因此它们的性能通常受到给定初始模型的上限约束。而网络设计另辟蹊径,试图减少密集模型参数中的固有冗余,进一步开发轻量级网络模型。
182 0
|
4月前
|
机器学习/深度学习 人工智能 计算机视觉
极智AI | 图像处理中对掩膜mask和ROI的理解
大家好,我是极智视界,本文介绍一下 图像处理中对掩膜 mask 和 ROI 的理解。
57 0
|
4月前
|
机器学习/深度学习 传感器 编解码
【多传感器融合】BEVFusion: 激光雷达和摄像头融合框架 NeurIPS 2022
BEVFusion提出一个融合多摄像头和激光雷达数据的框架,可用于3D检测。在自动驾驶领域,通过独立处理并融合摄像头和激光雷达数据,可以显著提升3D对象检测的准确性和稳健性,尤其是在激光雷达可能出现故障的真实场景中。
547 0
【多传感器融合】BEVFusion: 激光雷达和摄像头融合框架 NeurIPS 2022
|
4月前
|
算法 计算机视觉
图像特征提取--ORB算法
图像特征提取--ORB算法
58 0
|
5月前
ORB特征检测
ORB特征检测
40 1
|
11月前
|
机器学习/深度学习 数据可视化 vr&ar
CV的未来是图神经网络?中科院软件所发布全新CV模型ViG,性能超越ViT
CV的未来是图神经网络?中科院软件所发布全新CV模型ViG,性能超越ViT
114 0