当前位置: 首页 > news >正文

学习记录:VS2019+OpenCV3.4.1实现SURF库函数的调用

最近在学习opencv的使用,在参照书籍《OpenCV3编程入门》实现SURF时遇到不少问题,下面做归纳总结。
错误 LNK2019 无法解析的外部符号 “public: static struct cv::Ptr __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)” (?create@SURF@xfeatures2d@cv@@SA?AU?$Ptr@VSURF@xfeatures2d@cv@@@3@NHH_N0@Z)

因opencv_ffmpeg.dll、opencv_ffmpeg_64.dll和ffmpeg_version.cmake这三个文件下载失败,而无法生成opencv_xfeatures2d341d.lib

由于找不到opencv_features2d341d.dll……

几个巨坑的问题!!!

1.先贴出我的源码(照着书抄的)

main.c

#include <iostream>
#include <iomanip>
#include <windows.h>
#include <vector>
#include <time.h>
#include <stdio.h>
#include "../include/camera.h"		//camera.h是自定义头文件
#include "../include/myopencv.h"	//myopencv.h是自定义头文件
#pragma warning(disable:26812)		//忽略相机状态枚举enum警告using namespace std;
using namespace cv;					//opencv的命名空间int main(int argc, char argv[])
{//显示当前OpenCV的版本号printf("opencv version = %s\n", CV_VERSION);//载入两张原图并显示Mat src1 = imread("../picture/pic-test.jpg");Mat src2 = imread("../picture/logo.jpg");namedWindow("src1", WINDOW_KEEPRATIO);imshow("src1", src1);namedWindow("src2", WINDOW_KEEPRATIO);imshow("src2", src2);//定义SURF需要用到的变量和类int minHessian = 400;	//SURF中的hessian阈值特征点检测算子// SURF与SurfFeatureDetector等价//定义一个SurfFeatureDetector(SURF) 特征检测类对象Ptr<cv::xfeatures2d::SurfFeatureDetector>detector = cv::xfeatures2d::SurfFeatureDetector::create(minHessian);std::vector<KeyPoint> keypoints_1, keypoints_2;//调用detect函数检测出SURF特征关键点,保存在vector容器中detector->detect(src1,keypoints_1);detector->detect(src2, keypoints_2);//绘制特征关键点Mat img_keypoints_1, img_keypoints_2;
drawKeypoints(src1,keypoints_1,img_keypoints_1,Scalar(0,255,0),DrawMatchesFlags::DEFAULT);drawKeypoints(src2, keypoints_2, img_keypoints_2, Scalar(0, 255, 0), DrawMatchesFlags::DEFAULT);//显示效果图namedWindow("特征点检测效果图1", WINDOW_KEEPRATIO);namedWindow("特征点检测效果图2", WINDOW_KEEPRATIO);imshow("特征点检测效果图1", img_keypoints_1);imshow("特征点检测效果图2", img_keypoints_2);waitKey(0);/*while (1);*/ return	0;
}

myopencv.h

#pragma once
#pragma comment(lib,"../lib/opencv_world341.lib")		//Opencv的静态链接库
#pragma comment(lib,"../lib/opencv_world341d.lib")	
#pragma comment(lib,"../lib/opencv_calib3d341d.lib")	
#pragma comment(lib,"../lib/opencv_core341d.lib")	
#pragma comment(lib,"../lib/opencv_dnn341d.lib")	
#pragma comment(lib,"../lib/opencv_features2d341d.lib")	
#pragma comment(lib,"../lib/opencv_flann341d.lib")	
#pragma comment(lib,"../lib/opencv_highgui341d.lib")	
#pragma comment(lib,"../lib/opencv_imgcodecs341d.lib")	
#pragma comment(lib,"../lib/opencv_imgproc341d.lib")	
#pragma comment(lib,"../lib/opencv_ml341d.lib")	
#pragma comment(lib,"../lib/opencv_objdetect341d.lib")	
#pragma comment(lib,"../lib/opencv_photo341d.lib")	
#pragma comment(lib,"../lib/opencv_shape341d.lib")	
#pragma comment(lib,"../lib/opencv_stitching341d.lib")	
#pragma comment(lib,"../lib/opencv_superres341d.lib")	
#pragma comment(lib,"../lib/opencv_video341d.lib")	
#pragma comment(lib,"../lib/opencv_videoio341d.lib")	
#pragma comment(lib,"../lib/opencv_videostab341d.lib")	
#pragma comment(lib,"../lib/opencv_xfeatures2d341d.lib")#include <iostream>
#include <windows.h>
#include <vector>
#include "../include/opencv2/opencv.hpp"
#include "../include/opencv2/core/core.hpp"
#include "../include/opencv2/highgui/highgui.hpp"
#include "../include/opencv2/imgproc/imgproc.hpp"
#include "../include/opencv2/imgproc/imgproc_c.h"
#include "../opencv_contrib-3.4.1/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp"
#include "../opencv_contrib-3.4.1/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp"
#include "../include/opencv2/features2d/hal/interface.h"//#define	MYCOUTMAT	//是否选择重载输出MAT	
using namespace cv;		//opencv的命名空间
using namespace std;#ifdef MYCOUTMATostream& operator << (ostream& output, Mat& M);
#endif // MYCOUTMATvoid DisPlayPixelValue_PtrWay(Mat img, int start_pixelrow, int strat_pixelcol, int num_row, int num_col);
int DisPlayPixelValue_PiontWay(Mat img, int row, int col, int channel);

2.根据上面两个文件讲一讲我遇到的问题

首先建议大家下载一个everything,帮助查找文件,有些文件可能并不是没生成,而是生成的地方和别人不一样!!!

(1)nonfree.hpp和xfeatures2d.hpp文件在哪

在实现SURF时要用到这两个.hpp文件,而这两个文件不在opencv文件夹中,而是在opencv_contrib-3.4.1文件夹中,可参考我的路径找找。除此之外你可能还有修改一下这两个文件里头文件的include路径,例如下面,当然这个不是都一样的,取决于对应文件在个人电脑中的路径,这让人头大。
nonfree.hpp

原本是

#include<opencv2/features2d.hpp>

但根据需要我改成了

#include "../../../../../../include/opencv2/features2d/features2d.hpp"

两个.hpp文件找到后,并修改其中的include路径,就能定义SurfFeatureDetector类了。

//定义一个SurfFeatureDetector(SURF) 特征检测类对象Ptr<cv::xfeatures2d::SurfFeatureDetector>detector = cv::xfeatures2d::SurfFeatureDetector::create(minHessian);

(2)错误 LNK2019 无法解析的外部符号 “public: static struct cv::Ptr __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)” (?create@SURF@xfeatures2d@cv@@SA?AU?$Ptr@VSURF@xfeatures2d@cv@@@3@NHH_N0@Z)

①找到问题
在成功引用了nonfree.hpp和xfeatures2d.hpp文件后,编写代码就没有遇到什么问题了,但是运行后爆出上面的问题,脑子直接炸了。
百度后发现不少人有这个问题,参见https://blog.csdn.net/weixin_38383877/article/details/88417475
问题是
opencv_xfeatures2d320d.lib
opencv_features2d320d.lib
在哪里?

②生成这两个.lib
生成这两lib,关键在于如何使用cmake,这里推荐两个博主文章做参考,它们在细节上稍有区别,大家根据自己情况选择,我也不清楚为什么,玄学的很
https://blog.csdn.net/weixin_45645281/article/details/114937793
https://blog.csdn.net/weixin_42012977/article/details/82992962
参考了他们的文章,我在配置时做了这两件事:1)OPENCV_EXTRA_MODULES_PATH中
添加opencv_contrib-3.4.1/opencv_contrib-3.4.1/modules的路径;2)WITH_CUDA未勾选

在cmake中Configure和generate完后就可以Open Project了,这里推荐一篇博主文章
https://blog.csdn.net/excelNo1/article/details/118142075
看其中的第十步骤,编译CMakeTargets中的INSTALL,最后窗口会生成144项(我只有133不知道为什么),反正最后能生成我们要的.lib就行了
图1
接着我们到工程的install文件夹下就能看到很多lib文件了,其中就有我们需要的。
图2
图3
建议将这些.lib文件都添加到自己的工程里。另外有时在cmake配置时因opencv_ffmpeg.dll、opencv_ffmpeg_64.dll和ffmpeg_version.cmake这三个文件下载失败,而无法生成opencv_xfeatures2d341d.lib,可以参考这两篇文章
https://www.cnblogs.com/zss0502/p/12694737.html
https://blog.csdn.net/qq_34801642/article/details/105577349
到此为止,.lib生成完毕,然而程序还是跑不了,接着往下看

③由于找不到opencv_features2d341d.dll……程序无法执行
在cmake生成lib文件时也会生成很多dll文件,它们在install文件夹的bin目录下,在运行程序时需要调用它们。
图4
解决方法是把bin目录添加到电脑的系统变量PATH里,我是复制了bin文件夹放到opencv里在添加到系统变量PATH里
图5
这个感觉和安装opencv时添加build\x64\vc15\bin的路径的目的是一样的,因为build\x64\vc15\bin目录下也有不少dll文件,例如opencv_world341d.dll

完成以上工作,最后SURF程序就可以运行了。

3.上面程序运行效果图如下

图6

相关文章:

学习记录:VS2019+OpenCV3.4.1实现SURF库函数的调用

最近在学习opencv的使用&#xff0c;在参照书籍《OpenCV3编程入门》实现SURF时遇到不少问题&#xff0c;下面做归纳总结。 错误 LNK2019 无法解析的外部符号 “public: static struct cv::Ptr __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)” (?createSUR…...

JVM-基础知识

JVM-基础知识 什么是JVM JVM是一种跨语言的平台&#xff0c;任何语言只要能编译成.class文件都可以被JVM运行。JVM只和.class文件有关系&#xff0c;和Java语言没关系。JVM是一种虚拟机规范。 java文件是如何交给JVM执行的 JVM的常见实现 HostStop:Oracle官方另外还有IBM的J9、…...

保密工作应党而生、伴党而行、为党而兴

1.&#xff08;C &#xff09;工作应党而生、伴党而行、为党而兴&#xff0c;始终是党和国家的一项重要工作。 A. 农业 B. 国防 C. 保密 D. 文化 2.机关、单位对所产生的国家秘密事项&#xff0c;应当按照国家秘密及其密级的具体范围的规定确定密级&#xff0c;同时确定&#x…...

docker login 报错: http: server gave HTTP response to HTTPS client

环境&#xff1a; 自建 Harbor、Docker 1. 问题分析 # 命令&#xff0c;这里用的是 IP&#xff0c;可以为域名 docker login -u test 172.16.51.182:31120 # 输入密码 Password:# 报错如下&#xff1a; Error response from daemon: Get "https://172.16.51.182:31120/…...

「C系列」C 文件读写

文章目录 一、C 文件读写1. 打开文件2. 写入文件3. 读取文件4. 关闭文件5. 文件读写模式6. 错误处理 二、常见问题1. 文件打开失败2. 文件读写错误3. 文件读写位置4. 缓冲区刷新 三、相关链接 一、C 文件读写 在C语言中&#xff0c;文件读写是通过一系列的标准库函数来完成的&…...

编程中的cos:深度解析与应用探索

编程中的cos&#xff1a;深度解析与应用探索 在编程的广阔天地中&#xff0c;cos这一数学概念扮演着举足轻重的角色。它不仅是数学函数库中的基础元素&#xff0c;更是图形渲染、科学计算以及数据处理等多个领域的核心工具。本文将从四个方面、五个方面、六个方面和七个方面&a…...

计算机毕业设计hadoop+spark+hive知识图谱酒店推荐系统 酒店数据分析可视化大屏 酒店爬虫 高德地图API 酒店预测系统 大数据毕业设计

流程&#xff1a; 1.Python爬取去哪儿网全站旅游数据约10万&#xff0c;存入mysql; 2.使用pandasnumpy/hadoopmapreduce对mysql中旅游数据进行数据清洗&#xff0c;使用高德API计算地理信息&#xff0c;最终转为.csv文件上传hdfs; 3.hive建库建表导入.csv文件作为数据集&#x…...

简单谈谈云服务器私网IP的存在意义及优势

云服务器是基于虚拟化技术的计算资源&#xff0c;可以在云平台上灵活创建和管理。为了满足不同用户的需求&#xff0c;云服务提供商在云服务器上分配了两种类型的IP地址&#xff1a;公网IP和私网IP。其中&#xff0c;私网IP是指在局域网内使用的内部IP地址&#xff0c;无法通过…...

python错题(2)

、...

禁止methtype联网

mathtype断网_如何禁止mathtype联网-CSDN博客https://blog.csdn.net/qq_41060221/article/details/128144783...

【iOS】UI学习——cell的复用及自定义cell

目录 前言cell的复用手动&#xff08;非注册&#xff09;自动&#xff08;注册&#xff09; 自定义cell总结 前言 Cell复用和自定义Cell是在开发iOS应用时常见的一种优化技巧和定制需求。   Cell复用是UITableView或UICollectionView的一个重要优化机制。当用户滚动这些视图时…...

【详细介绍下PostgreSQL】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

基于Matlab停车场车牌识别计时计费管理系统 【W2】

简介 停车场车牌识别计时计费管理系统在现代城市管理中具有重要意义。随着城市化进程的加快和车辆数量的增加&#xff0c;传统的人工管理停车场的方式已经难以满足效率和精确度的要求。因此引入车牌识别技术的自动化管理系统成为一种趋势和解决方案。 背景意义 提升管理效率&a…...

码住!详解时序数据库不同分类与性能对比

加速发展中的时序数据库&#xff0c;基于不同架构&#xff0c;最流行的类别是&#xff1f; 作为管理工业场景时序数据的新兴数据库品类&#xff0c;时序数据库凭借着对海量时序数据的高效存储、高可扩展性、时序分析计算等特性&#xff0c;一跃成为物联网时代工业领域颇受欢迎的…...

【C/C++】实参与形参的区别

在编程中&#xff0c;形参&#xff08;形式参数&#xff09;和实参&#xff08;实际参数&#xff09;是函数调用中的两个基本概念&#xff0c;它们在函数定义和函数调用中扮演着不同的角色。 形参&#xff08;Formal Parameters&#xff09;&#xff1a; 形参是在函数定义时声明…...

---异常---

我们在运行程序时总遇到各种与报错&#xff0c;数组越界&#xff0c;空指针的引用&#xff0c;这些在java中都称为异常 对于不同的错误都具有一个与他对应的异常类来秒描述 这是对于数组越界这个类里有的方法&#xff0c;这些是描述异常的 在java中有一个完整的描述异常的类的…...

python如何终止程序运行

方法1&#xff1a;采用sys.exit(0)&#xff0c;正常终止程序&#xff0c;从图中可以看到&#xff0c;程序终止后shell运行不受影响。 方法2&#xff1a;采用os._exit(0)关闭整个shell&#xff0c;从图中看到&#xff0c;调用sys._exit(0)后整个shell都重启了&#xff08;RESTAR…...

网络:用2个IP地址描述一个连接

用2个IP地址描述一个连接。这是在阅读了《TCP/IP指南》后的感想&#xff0c;与工业标准不同&#xff0c;需注意区分。 如果一个IP地址有48位&#xff0c;则用96位描述一个连接 对于单播&#xff0c;是每个IP分别描述位置。位置包括&#xff1a;邮局编号主机编号&#xff0c;采用…...

Nodejs--构建web应用

构建web应用 将从http模块中的服务器端中的request使劲按开始分析&#xff0c;request时间发生于网络连接建立&#xff0c;客户端想服务器发送报文&#xff0c;服务器解析报文&#xff0c;发现http请求的报文的时候&#xff0c;在出发request事件之前&#xff0c;已经准备好Se…...

C++ 二分查找法【面试】

在C中实现二分查找法是一个常见的面试问题。二分查找法是一种在有序数组中查找特定元素的算法&#xff0c;其时间复杂度为O(log n)。以下是使用C实现二分查找的示例代码&#xff1a; #include <iostream> #include <vector>// 二分查找法函数 int binarySearch(co…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...