【图片匹配】--- SIFT_Opencv3.1.0_C++_ubuntu

  最近在捣鼓图片相似性匹配算法。这里先说一点必要的题外话:

如果是在同一个object不同角度拍摄的多张图片中,使用SIFT可以有不错的效果;

如果是寻找类别相同的图片(可能不是同一object),SIFT是无效的。

前言:

  1 需要安装好opencv3.1.0 + opencv_contrib(放到 opencv主文件夹的module文件夹中)。

  2 可以使用IDE 比如:Codeblocks  or  Eclipse etc 配置好opencv开发所需要的 头文件 + lib so 库文件。

  但是我这里是直接手写的 g++ 编译命令,这样省事儿,可以方便展示。这里不得不吐槽一下,网上一大堆 搓逼教程,乱配置一气,有用的没用的全抄上,而且3.1.0中的imshow等基础的函数都已经换了头文件了。并不在highgui中了。所以我就自己手写了 编译命令,用什么加什么。

代码如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>  //头文件
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;  //包含cv命名空间
using namespace std;

int main()
{
    //Create SIFT class pointer
    Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
    //读入图片
    Mat img_1 = imread("kebe1.jpg");
    Mat img_2 = imread("kebe2.jpg");
    //Detect the keypoints
    vector<KeyPoint> keypoints_1, keypoints_2;
    f2d->detect(img_1, keypoints_1);
    f2d->detect(img_2, keypoints_2);
    //Calculate descriptors (feature vectors)
    Mat descriptors_1, descriptors_2;
    f2d->compute(img_1, keypoints_1, descriptors_1);
    f2d->compute(img_2, keypoints_2, descriptors_2);
    //Matching descriptor vector using BFMatcher
    BFMatcher matcher;
    vector<DMatch> matches;
    matcher.match(descriptors_1, descriptors_2, matches);
    //绘制匹配出的关键点lopencv_core
    Mat img_matches;
    drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
    imshow("【match图】", img_matches);
    //等待任意按键按下
    waitKey(0);
}
//g++ sift_match.cpp -o output -L/usr/local/lib -lopencv_imgcodecs  -lopencv_highgui -lopencv_xfeatures2d -lopencv_features2d -lopencv_core -I/usr/local/include

  文件夹下有两张图片,使用最下面注释的 编译命令直接运行

./output 即可。

  发现这也不咋准啊! 当然我使用的不是同一张皂片的不同角度,只是觉得差不多。

  下一步,打算校准 + 具体实现使用SIFT来衡量图片的相似度。

  

时间: 2024-10-15 03:06:46

【图片匹配】--- SIFT_Opencv3.1.0_C++_ubuntu的相关文章

OpenCV 入门教程 之环境配置 + 图片匹配 matchTemplate

1.什么是OpenCV OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成. 总结特点: 1.开源, 商业用途也不必公开自己的源代码或者改善后的代码. 2.效率高,简单的图像处理就算了,涉及到复杂的处理一般的类库无法满足比如CXImage 3.有巨头维护(Intel) 有这三个

图片上传前压缩 lrz库

之前手机微信端的项目因为图片太大导致体验十分不流畅,后来采用把上传的图片统一压缩大小后解了燃眉之急. 但这个方法的遗憾就是得等到图片上传后在服务器端压缩,用户如果上传比较大的图片耗时太大,而且也耗流量. 关键是在用户上传前就把图片压缩了,如今找到了解决方法: 用了lrz这个库,http://www.jq22.com/jquery-info3419,感谢这个地址 平常手机照片2M的图一般能压缩到150kb左右,效果明显 首先引入三个库文件 <script type="text/javascr

利用urllib下载图片

# 爬虫项目原理:打开网址---获取源码---找到图片---匹配取出## urllib模块:urlopen打开---read源码# urlretrieve保存到文件,下载

Python图片识别找坐标(appium通过识别图片点击坐标)

***如果只想了解图片相似度识别,直接看第一步即可 ***如果想了解appium根据图片识别点击坐标,需要看第一.二.三步 背景|在做UI测试时,发现iOS自定义的UI控件,appium识别不到.所以考虑通过识别图片找坐标,进而通过点击坐标解决问题 依赖python包|opencv.numpy.aircv 第一步:查找图片在原始图片上的坐标点 import aircv as ac def matchImg(imgsrc,imgobj,confidencevalue=0.5):#imgsrc=原始

php 图片base64编码生成dataurl和保存为图片

<?php header('Content-type:text/html;charset=utf-8'); //读取图片文件,转换成base64编码格式 $image_file = 'aaa.jpg'; $image_info = getimagesize($image_file); // $base64_image_content = "data:{$image_info['mime']};base64," . chunk_split(base64_encode(file_ge

怎样防止自己网站上的图片被盗取查看

图片防盗: 是不想自己的图片被别人使用. 图片防盗链: 是不想自己的图片被别人使用,且消耗的是自己的服务器流量. 图片防盗是困难的,完美的图片防盗那几乎是不可能的.但还是有很多方法能够减少图片盗用,下面是10种,选一种你喜欢的吧. 隐藏图片 使用空白图片覆盖真实图片 这个方法可以让别人无法获取真实的图片,除非查看源代码. 你可以把真实的图片做为背景图片,而使用一张透明图片匹配尺寸并覆盖到真实图片上面. 例如: <div id="image1" style="backgr

图片的base64编码

<?php header('Content-type:text/html;charset=utf-8'); //读取图片文件,转换成base64编码格式 $image_file = './111.jpg'; $image_info = getimagesize($image_file); $base64_image_content = "data:{$image_info['mime']};base64," . chunk_split(base64_encode(file_get

【PHP原生】base64传图片

base64是一种编码,用6个二进位来表示一个字节. 图片可通过base64编码转换成一组字符串.直接解码该字符串即可获取图片. base64编码后的图片写入网页可以减少一个http请求,但是不能缓存图片.而且编码后比原来图片体积大三分之一左右. 所以只适用于icon这类10K以内的图片. html中直接显示base64编码后的图片 <img src="data:image/png;base64,iVBORw0KGgoAAA....."> PHP将图片转base64数据 $

airtest之api、图片处理

airetest框架 api touch touch((600, 500), duration=1) 长按 text: 文字输入 keyevent: 按键输入,包括(HOME/BACK/MENU等) sleep: 等待 snapshot: 截屏 swipe(Template, vector=[0.0313, -0.481])在执行手动 swipe 截图时,画框后,单击滑动终点完成语句录制 connect_dev("Android://127.0.0.1:5037/serialno1")