SIFT的两个版本:OpenCV和VL_SIFT

article/2025/9/1 20:25:34

暂时记录一下

OpenCV版本:

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/core.hpp>
#include<opencv2/features2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;int main(int argc, char* argv[]) {Mat img_object = imread("a.jpg", IMREAD_GRAYSCALE);Mat img_scene = imread("b.jpg", IMREAD_GRAYSCALE);Ptr<SIFT> detector = SIFT::create(argc > 1 ? atoi(argv[1]) : 400);if (img_object.empty() || img_scene.empty()) {cout << "Could not open or find the image!\n" << endl;return -1;}std::vector<KeyPoint> keypoints_object, keypoints_scene;Mat descriptors_object, descriptors_scene;detector->detectAndCompute(img_object, noArray(), keypoints_object, descriptors_object);detector->detectAndCompute(img_scene, noArray(), keypoints_scene, descriptors_scene);//-- Step 2: Matching descriptor vectors with a FLANN based matcher// Since SURF is a floating-point descriptor NORM_L2 is usedPtr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::FLANNBASED);std::vector< std::vector<DMatch> > knn_matches;matcher->knnMatch(descriptors_object, descriptors_scene, knn_matches, 2);//-- Filter matches using the Lowe's ratio testconst float ratio_thresh = 0.85f;std::vector<DMatch> good_matches;for (size_t i = 0; i < knn_matches.size(); i++){if (knn_matches[i][0].distance < ratio_thresh * knn_matches[i][1].distance){good_matches.push_back(knn_matches[i][0]);}}img_object = imread("a.jpg");img_scene = imread("b.jpg");for (auto& k : keypoints_object) {circle(img_object, k.pt, k.size, CV_RGB(255, 0, 0));}for (auto& k : keypoints_scene) {circle(img_scene, k.pt, k.size, CV_RGB(0, 255, 0));}//-- Draw matchesMat img_matches;drawMatches(img_object, keypoints_object, img_scene, keypoints_scene, good_matches, img_matches, Scalar::all(-1),Scalar::all(-1), std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);//-- Localize the objectstd::vector<Point2f> obj;std::vector<Point2f> scene;for (size_t i = 0; i < good_matches.size(); i++){//-- Get the keypoints from the good matchesobj.push_back(keypoints_object[good_matches[i].queryIdx].pt);scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);}/*Mat H = findHomography(obj, scene, RANSAC);//-- Get the corners from the image_1 ( the object to be "detected" )std::vector<Point2f> obj_corners(4);obj_corners[0] = Point2f(0, 0);obj_corners[1] = Point2f((float)img_object.cols, 0);obj_corners[2] = Point2f((float)img_object.cols, (float)img_object.rows);obj_corners[3] = Point2f(0, (float)img_object.rows);std::vector<Point2f> scene_corners(4);perspectiveTransform(obj_corners, scene_corners, H);//-- Draw lines between the corners (the mapped object in the scene - image_2 )line(img_matches, scene_corners[0] + Point2f((float)img_object.cols, 0),scene_corners[1] + Point2f((float)img_object.cols, 0), Scalar(0, 255, 0), 4);line(img_matches, scene_corners[1] + Point2f((float)img_object.cols, 0),scene_corners[2] + Point2f((float)img_object.cols, 0), Scalar(0, 255, 0), 4);line(img_matches, scene_corners[2] + Point2f((float)img_object.cols, 0),scene_corners[3] + Point2f((float)img_object.cols, 0), Scalar(0, 255, 0), 4);line(img_matches, scene_corners[3] + Point2f((float)img_object.cols, 0),scene_corners[0] + Point2f((float)img_object.cols, 0), Scalar(0, 255, 0), 4);*///-- Show detected matchesimshow("Good Matches & Object detection", img_matches);waitKey();return 0;
}

如果要用SURF,改这行代码即可:

//Ptr<SIFT> detector = SIFT::create(argc > 1 ? atoi(argv[1]) : 400);
Ptr<SURF> detector = SURF::create(argc > 1 ? atoi(argv[1]) : 400);

SURF是受专利保护的,所以编译OpenCV的时候需要把Contrib包一起编译,还要勾选OPENCV_ENABLE_NONFREE
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210314181942339.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,tex

_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY2NTIyNQ==,size_16,color_FFFFFF,t_70#pic_center)

SURF比较慢,精度怎样不做比较。

VLFeat 的SIFT版本据说比OpenCV好。

官网:https://www.vlfeat.org/

代码下载来后,为Visual Studio 2019建立工程文件 libvlfeat_sift.vcxproj 和vl目录同一级。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|x64"><Configuration>Debug</Configuration><Platform>x64</Platform></ProjectConfiguration><ProjectConfiguration Include="Release|x64"><Configuration>Release</Configuration><Platform>x64</Platform></ProjectConfiguration></ItemGroup><PropertyGroup Label="Globals"><VCProjectVersion>16.0</VCProjectVersion><Keyword>Win32Proj</Keyword><ProjectGuid>{dfd18de8-c6e6-45dc-88a3-91545155cac8}</ProjectGuid><RootNamespace>libvlfeatsift</RootNamespace><WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion></PropertyGroup><Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"><ConfigurationType>DynamicLibrary</ConfigurationType><UseDebugLibraries>true</UseDebugLibraries><PlatformToolset>v142</PlatformToolset><CharacterSet>MultiByte</CharacterSet></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"><ConfigurationType>DynamicLibrary</ConfigurationType><UseDebugLibraries>false</UseDebugLibraries><PlatformToolset>v142</PlatformToolset><WholeProgramOptimization>true</WholeProgramOptimization><CharacterSet>MultiByte</CharacterSet></PropertyGroup><Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /><ImportGroup Label="ExtensionSettings"></ImportGroup><ImportGroup Label="Shared"></ImportGroup><ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /></ImportGroup><ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /></ImportGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><LinkIncremental>true</LinkIncremental><TargetName>$(ProjectName)d</TargetName></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><LinkIncremental>false</LinkIncremental></PropertyGroup><ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><ClCompile><WarningLevel>Level3</WarningLevel><SDLCheck>false</SDLCheck><PreprocessorDefinitions>VL_BUILD_DLL;_LIB;_CRT_SECURE_NO_WARNINGS;VL_DISABLE_SSE2;VL_DISABLE_AVX;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions><ConformanceMode>true</ConformanceMode><PrecompiledHeader>NotUsing</PrecompiledHeader><PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile></ClCompile><Link><SubSystem></SubSystem><GenerateDebugInformation>true</GenerateDebugInformation></Link></ItemDefinitionGroup><ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><ClCompile><WarningLevel>Level3</WarningLevel><FunctionLevelLinking>true</FunctionLevelLinking><IntrinsicFunctions>true</IntrinsicFunctions><SDLCheck>false</SDLCheck><PreprocessorDefinitions>VL_BUILD_DLL;_LIB;_CRT_SECURE_NO_WARNINGS;VL_DISABLE_SSE2;VL_DISABLE_AVX;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions><ConformanceMode>true</ConformanceMode><PrecompiledHeader>NotUsing</PrecompiledHeader><PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile></ClCompile><Link><SubSystem></SubSystem><EnableCOMDATFolding>true</EnableCOMDATFolding><OptimizeReferences>true</OptimizeReferences><GenerateDebugInformation>true</GenerateDebugInformation></Link></ItemDefinitionGroup><ItemGroup><ClInclude Include="vl\aib.h" /><ClInclude Include="vl\array.h" /><ClInclude Include="vl\covdet.h" /><ClInclude Include="vl\dsift.h" /><ClInclude Include="vl\fisher.h" /><ClInclude Include="vl\framework.h" /><ClInclude Include="vl\generic.h" /><ClInclude Include="vl\getopt_long.h" /><ClInclude Include="vl\gmm.h" /><ClInclude Include="vl\heap-def.h" /><ClInclude Include="vl\hikmeans.h" /><ClInclude Include="vl\hog.h" /><ClInclude Include="vl\homkermap.h" /><ClInclude Include="vl\host.h" /><ClInclude Include="vl\ikmeans.h" /><ClInclude Include="vl\imopv.h" /><ClInclude Include="vl\imopv_sse2.h" /><ClInclude Include="vl\kdtree.h" /><ClInclude Include="vl\kmeans.h" /><ClInclude Include="vl\lbp.h" /><ClInclude Include="vl\liop.h" /><ClInclude Include="vl\mathop.h" /><ClInclude Include="vl\mathop_avx.h" /><ClInclude Include="vl\mathop_sse2.h" /><ClInclude Include="vl\mser.h" /><ClInclude Include="vl\pch.h" /><ClInclude Include="vl\pgm.h" /><ClInclude Include="vl\qsort-def.h" /><ClInclude Include="vl\quickshift.h" /><ClInclude Include="vl\random.h" /><ClInclude Include="vl\rodrigues.h" /><ClInclude Include="vl\scalespace.h" /><ClInclude Include="vl\shuffle-def.h" /><ClInclude Include="vl\sift.h" /><ClInclude Include="vl\slic.h" /><ClInclude Include="vl\stringop.h" /><ClInclude Include="vl\svm.h" /><ClInclude Include="vl\svmdataset.h" /><ClInclude Include="vl\vlad.h" /></ItemGroup><ItemGroup><ClCompile Include="vl\aib.c" /><ClCompile Include="vl\array.c" /><ClCompile Include="vl\covdet.c" /><ClCompile Include="vl\dsift.c" /><ClCompile Include="vl\fisher.c" /><ClCompile Include="vl\generic.c" /><ClCompile Include="vl\getopt_long.c" /><ClCompile Include="vl\gmm.c" /><ClCompile Include="vl\hikmeans.c" /><ClCompile Include="vl\hog.c" /><ClCompile Include="vl\homkermap.c" /><ClCompile Include="vl\host.c" /><ClCompile Include="vl\ikmeans.c" /><ClCompile Include="vl\imopv.c" /><ClCompile Include="vl\imopv_sse2.c" /><ClCompile Include="vl\kdtree.c" /><ClCompile Include="vl\kmeans.c" /><ClCompile Include="vl\lbp.c" /><ClCompile Include="vl\liop.c" /><ClCompile Include="vl\mathop.c" /><ClCompile Include="vl\mathop_avx.c" /><ClCompile Include="vl\mathop_sse2.c" /><ClCompile Include="vl\mser.c" /><ClCompile Include="vl\pgm.c" /><ClCompile Include="vl\quickshift.c" /><ClCompile Include="vl\random.c" /><ClCompile Include="vl\rodrigues.c" /><ClCompile Include="vl\scalespace.c" /><ClCompile Include="vl\sift.c" /><ClCompile Include="vl\slic.c" /><ClCompile Include="vl\stringop.c" /><ClCompile Include="vl\svm.c" /><ClCompile Include="vl\svmdataset.c" /><ClCompile Include="vl\vlad.c" /></ItemGroup><Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /><ImportGroup Label="ExtensionTargets"></ImportGroup>
</Project>

使用vl_sift

#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;
#define PI 3.1415926
extern "C" {
#include <vl/generic.h>
#include <vl/stringop.h>
#include <vl/sift.h>
#include <vl/getopt_long.h>
};
struct QKeyPoint {float o;float x;float y;float r;float main_angle;int angle_cnt;float desc[4][128];};void vl_sift_extract(VlSiftFilt* vl_sift, vl_sift_pix* data, vector<KeyPoint>& kpts, Mat& desc) {if (vl_sift_process_first_octave(vl_sift, data) == VL_ERR_EOF) return;double angles[4];vector<float*> temp;//// float* d = reinterpret_cast<float*>(desc.data);do {vl_sift_detect(vl_sift);VlSiftKeypoint* p = vl_sift->keys;for (int i = 0; i < vl_sift->nkeys; i++, p++) {KeyPoint kp(Point2f(p->x, p->y), p->sigma);int angle_cnt = vl_sift_calc_keypoint_orientations(vl_sift, angles, p);if (angle_cnt > 0) {kp.angle = angles[0] / PI * 360;float* d = new float[128];vl_sift_calc_keypoint_descriptor(vl_sift, d , p, angles[0]);temp.push_back(d);}kp.octave = p->o; kpts.push_back(kp);}} while (vl_sift_process_next_octave(vl_sift) != VL_ERR_EOF);desc = Mat::zeros(temp.size(), 128, CV_32FC1);float* d = reinterpret_cast<float*>(desc.data);for (int i = 0; i < temp.size(); i++ , d+= 128) {memcpy(d, temp[i], 128 * sizeof(float));delete[]temp[i];}} 
const char* name1 = "a.jpg";
const char* name2 = "b.jpg";
int main(int argc, char* argv[]) {Mat img = imread(name1, IMREAD_GRAYSCALE);Mat float_img;img.convertTo(float_img, CV_32F);Mat color_img_a = imread(name1);Mat color_img_b = imread(name2);VlSiftFilt* vl_sift = vl_sift_new(img.cols, img.rows, 4, 3, 0);vl_sift_set_peak_thresh(vl_sift, atof(argv[1]));vl_sift_set_edge_thresh(vl_sift, atof(argv[2]));vector<KeyPoint> kpts_a, kpts_b;Mat desc_a, desc_b;vl_sift_extract(vl_sift, (vl_sift_pix*)(float_img.data), kpts_a, desc_a);img = imread(name2, IMREAD_GRAYSCALE);img.convertTo(float_img, CV_32F);VlSiftFilt* vl_sift2 = vl_sift_new(img.cols, img.rows, 4, 3, 0);vl_sift_set_peak_thresh(vl_sift2, atof(argv[1]));vl_sift_set_edge_thresh(vl_sift2, atof(argv[2]));vl_sift_extract(vl_sift2, (vl_sift_pix*)(float_img.data), kpts_b, desc_b);cout << " Features : " << kpts_a.size() << ", " << kpts_b.size() << endl;for (auto& k : kpts_a) {circle(color_img_a, k.pt, k.size, CV_RGB(255, 0, 0)); }for (auto& k : kpts_b) {circle(color_img_b, k.pt, k.size, CV_RGB(0, 255, 0)); }Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::FLANNBASED);vector<  vector<DMatch> > knn_matches;matcher->knnMatch(desc_a, desc_b, knn_matches, 2);//-- Filter matches using the Lowe's ratio testconst float ratio_thresh = 0.75f;std::vector<DMatch> good_matches;for (size_t i = 0; i < knn_matches.size(); i++){if (knn_matches[i][0].distance < ratio_thresh * knn_matches[i][1].distance){good_matches.push_back(knn_matches[i][0]);}}//-- Draw matchesMat img_matches;drawMatches(color_img_a, kpts_a, color_img_b, kpts_b, good_matches, img_matches, Scalar::all(-1),Scalar::all(-1), std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);vl_sift_delete(vl_sift);vl_sift_delete(vl_sift2);//imshow("SIFT Match Testing", img_matches);imwrite("match-result.jpg", img_matches); return 0;
}

没有大变化的话,匹配效果还可以。

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/vvNZ7yaS.shtml

相关文章

论文阅读笔记《Matching Images With Multiple Descriptors: An Unsupervised Approach for Locally Adaptive》

核心思想 本文提出一种将多种特征描述算法融合起来实现更好图像匹配的方法。近些年来&#xff0c;图像特征的描述算法层出不穷如SIFT、LIOP 、DAISY等等&#xff0c;每种方法都有各自的优势和侧重点&#xff0c;对于不同图像其效果也各有优劣。那么能不能将多种算法的优势结合起…

LIFT: Learned Invariant Feature Transform详细笔记

LIFT: Learned Invariant Feature Transform Paper: LIFT: Learned Invariant Feature Transform | SpringerLink Code: GitHub - cvlab-epfl/LIFT: Code release for the ECCV 2016 paper 文章目录 Abstract思路来源LIFT文献来源 方法&#xff1a;LIFTPipeline网络架构训练流…

简单的倒计时shell脚本

效果如下: 代码如下: #! /bin/bash #####################倒计时################ #作者:liop #完成时间:2019.12.17 #三位数以内秒数的倒计时 ########################################## display(){case $1 in1)case $2 in1)echo "******** ";;2)echo "…

计算机视觉领域经典论文源码

计算机视觉领域经典论文源码 转载自&#xff1a;http://blog.csdn.net/ddreaming/article/details/52416643 2016-CVPR论文代码资源&#xff1a; https://tensortalk.com/?catconference-cvpr-2016 一个GitHub账号&#xff0c;里面有很多计算机视觉领域最新论文的代码实现&am…

【译文】Local Intensity Order Pattern for Feature Description

在上一篇文章【特征检测】LIOP特征描述算法中讲到了LIOP描述符&#xff0c;下面我将原文翻译如下&#xff0c;如有出入请以原文为准。 —————————————————————————————————————————————————————————————————…

[2015 Springer] Local Image Descriptor: Modern Approaches——2 Classical Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103610331 翻译 本地图像描述…

[2015 Springer] Local Image Descriptor: Modern Approaches——3 Intensity Order-Based Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/10361…

在SIFT和SURF之后,有哪些比较新的且具有一定影响力的自然图像配准算法?

链接&#xff1a;https://www.zhihu.com/question/32066833/answer/2041516754 编辑&#xff1a;深度学习与计算机视觉 声明&#xff1a;仅做学术分享&#xff0c;侵删 作者&#xff1a;Vinjn张静https://www.zhihu.com/question/32066833/answer/54575191 我就提一下 OpenCV 中…

matlab vlfeat hog,vlfeat-0.9.20-bin 特征提取的工具包,实现各种 ,如hog,lbp,sift. matlab 242万源代码下载- www.pudn.com...

文件名称: vlfeat-0.9.20-bin下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 17828 KB 上传时间: 2015-07-21 下载次数: 0 提 供 者: 刘晓晶 详细说明&#xff1a;特征提取的工具包&#xff0c;实现各种特征&#xff0c;如hog,lbp,sift.-Feature extraction kit …

关于视觉SLAM的最先进技术的调查-A survey of state-of-the-art on visual SLAM

原文见文章末尾&#xff1a; 今天读了一篇视觉slam的综述&#xff0c;真的是读了一天&#xff0c;记录一下。我比较关注的是特征提取和匹配和深度学习有关的章节。好久&#xff0c;但是还算是有收获的吧。 摘要&#xff1a; 本文概述了视觉同步定位和测绘&#xff08;V-SLAM&a…

队列

目录 队列的概念及结构队列代码实现 队列的概念及结构 队列和栈略有不同&#xff0c;队列是先进后出的一种数据结构&#xff0c;通常使用链表来表示&#xff0c;当然有一种特殊的循环队列使用顺序表来进行表示的。 队列只允许从后进入&#xff0c;从前弹出&#xff0c;就像我们…

HPatches数据集(图像匹配)---2关于评估代码的解释---和python画出结果

关于画图: 参考: Matplotlib系列: https://blog.csdn.net/yuyh131/category_7823048.html 关于评估代码的解释: 我们先提前下载所有算法对数据集patches提取的描述符: ./download.sh descr List of available descriptor results file for HPatches: ----------------------…

LIOP特征

注&#xff1a;本文是笔者在阅读相关英文文献后&#xff0c;翻译、整理所得&#xff1b;原文是&#xff1a;Local Intensity Order Pattern for Feature Description&#xff1b; Zhenhua Wang, Bin Fan, and Fuchao Wu&#xff1b;ICCV2011 LIOP: Local Intensity Order Patte…

【特征检测】LIOP特征描述算法

简介&#xff1a; LIOP特征描述算法&#xff0c;是2011年ICCV上一片paper《Local Intensity Order Pattern for Feature Description》中提出的一种特征描述算法。等有空闲时间把原文仔细翻译一遍&#xff0c;然后放上来分享给大家。 算法的提出者也是比较厉害的&#xff0c;其…

php把字符串日期转成时间戳,php怎样把日期转成时间戳

php把日期转成时间戳的方法&#xff1a;可以利用strtotime()函数来实现。strtotime()函数可以将任何字符串的日期时间描述解析为Unix时间戳&#xff0c;若成功则返回时间戳&#xff0c;失败则返回false。 strtotime() 函数将任何字符串的日期时间描述解析为 Unix 时间戳&#x…

java日期转时间戳精确到毫秒

代码如下&#xff1a; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test {public static void main(String[] args) {long daytimeToStamp("2019-08-06 11:22:32");System.out.println(day);//输出1…

go 日期时间戳转换

一、日期字符串转成时间戳 //设置时区 var LOC, _ time.LoadLocation("Asia/Shanghai") //日期时间字符串 timeStr : "2022-10-10 10:00:00" //要转换成时间日期的格式模板&#xff08;go诞生时间&#xff0c;模板必须是这个时间&#xff09; timeTmepla…

java中如何把字符串日期转时间戳

定义一个字符串日期; String dataStr"2022-06-01"; public static java.sql.Timestamp parseTimestamp(String dateStr) {return parseTimestamp(dateStr, "yyyy/MM/dd HH:mm:ss"); } public static java.sql.Timestamp parseTimestamp(String dateStr,…

C语言 日期转时间戳

C语言 日期转时间戳 废话先说啥时候开始数&#xff1f;站在2022的肩膀上&#xff01;一年能“嘀嗒”多少下&#xff1f;言归正传 废话先说 关于用C实现日期转时间戳&#xff0c;面对这样一个很基础的功能&#xff0c;作为一个小白白当然是&#xff0c;先百度&#xff0c;再看C…

制作持久化U盘Kali 用U盘启动 使用fluxion破解WIFI密码(上)

这次文章包含两部分, 一部分是如何制作U盘KALI, 另一部分说明如何使用这新制作的U盘启动, 再使用fluxion 破解WIFI密码. 等以后有空写一份如何用airmon-ng来破WIFI密码吧. 本文针对有一定基础的初学者, 主要是说明有哪些坑要避开。因为装了几次发现太多坑了, 不想大家再走弯…