ubuntu20.04+opencv4.5.4(contrib)+vscode配置

安装

首先是下载opencv和opencv_contrib,注意版本要完全一致。
下载链接:https://github.com/opencv
两个文件夹并列放在同一个文件夹下也行,opencv_contrib放在opencv下也行。

在opencv文件夹下新建一个build文件夹,进入build文件夹,在这个文件夹中进行cmake,cmake的指令如下:

sudo cmake -D CMAKE_BUILD_TYPE=Release      
					-D CMAKE_INSTALL_PREFIX=/usr/local 
					-D OPENCV_EXTRA_MODULES_PATH=/home/xxx/opencv4.5.4/opencv-4.5.4
	/opencv_contrib-4.5.4/modules   //这里要改成自己opencv_contrib中的modules的地址
					-D OPENCV_ENABLE_NONFREE=ON ..   // 这个一定要设置为on,要不然不能用surf等函数

不想用指令的话,下载一个cmake-gui,看起来清楚一些,各个选项可以直接设置。(参考:https://blog.csdn.net/weixin_53660567/article/details/120979339)
cmake选项没设置好,虽然可能安装成功,但是使用时会报错:
ubuntu20.04+opencv4.5.4(contrib)+vscode配置_第1张图片

cmake结束后:

sudo make -j8

后面的数字是线程数,线程越多,过程越快,但是要考虑自己cpu的核数。

cmake中会有无数的坑,但是报错不明显,不仔细看还发现不了,但是在下一步make的时候错误就会显现出来,下面大概总结一下:

1、找不到IPPVICV、vggxxx、boostxxx、dataxxx等等,这些是在cmake过程中需要下载的,但是由于种种原因没有下载成功,首先升级一下cmake,因为低版本的cmake可能不支持https,重新cmake可以将报错看得更清楚一些。当然,问题还是没有解决,有下面两种方法:
(1)把这些缺少的文件手动下载来放在适当的位置,这些文件网上都有资源,但是光下载下来不够,还要在相应的.cmake文件把原来的网址改成路径,路径以"file:"开头。我用这个办法装了一些文件,但是有些文件还是没搞好,换方法(2)。
(2)仔细观察发现cmakez中需要下载的文件都来源于https://raw.githubusercontent.com这个网站,但是这个网站被墙了,所以会下载失败,我试过开代理,但是没有用。找个查ip的网站,查到https://raw.githubusercontent.com的ip,有四个,全部添加到/etc/hosts文件后面,格式如下:

185.199.108.133 raw.githubusercontent.com
185.199.109.133 raw.githubusercontent.com
185.199.110.133 raw.githubusercontent.com
185.199.111.133 raw.githubusercontent.com

然后就可以正常下载了,当然有时候还是会失败,只能多等一会儿,多试几次。。。

2、找不到hdf5.h。这个是在opencv4.5.4/opencv_contrib-4.5.4/modules/hdf/src/hdf5.cpp中报的错,因为找不到hdf5.h这个头文件。
ubuntu20.04+opencv4.5.4(contrib)+vscode配置_第2张图片

首先安装hdf5模块:

sudo apt-get install libhdf5-dev

重新make,可能还是报错,我看网上都是将hdf5的路径包含进来就解决这个错误了(具体参考:https://github.com/opencv/opencv/issues/6016),但是我加了那两行也没有用,于是我直接在电脑中搜索hdf5.h,发现存在于/usr/include/hdf5/serial/中,于是修改opencv4.5.4/opencv_contrib-4.5.4/modules/hdf/src/hdf5.cpp,将# include 修改为# include "/usr/include/hdf5/serial/hdf5.h",成功解决了这个报错。

3、重新make。又报错,说找不到lhdf5依赖项。我找到了这个解决方法(https://github.com/NVIDIA/DIGITS/issues/156):
ubuntu20.04+opencv4.5.4(contrib)+vscode配置_第3张图片

我在/usr/lib/x86_64-linux-gun里成功找到了libhdf5_serial_hl.so,于是建立软连接:sudo ln -s libhdf5_serial_hl.so.8.0.2 libhdf5_hl.so

解决了这些坑,make成功之后,别忘了install。

sudo make install

ubuntu20.04+opencv4.5.4(contrib)+vscode配置_第4张图片

装好了截个图开心一下。

配置

首先是在系统中配置,参考https://blog.csdn.net/weixin_45629790/article/details/113242250的后半段,最后有摄像头就说明基础库没问题了。

然后在vscode中配置,这个网上有很多教程,主要就是改那三个json文件,opencv4和以前版本的文件夹不一样,这里给出我适用的三个json文件(参考文章找不到了,对不起原作者了)。
task:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",  /* 与launch.json文件里的preLaunchTask的内容保持一致 */
            "command": "/usr/bin/g++",
            "args": [
                "-std=c++11",
                "-g",
                //"${file}",   /* 编译单个文件 */
                "${fileDirname}/*.cpp",  /* 编译多个文件 */
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",  /* 输出文件路径 */
 
                /* 项目所需的头文件路径 */
                "-I","${workspaceFolder}/",
                "-I","/usr/local/include/",
                "-I","/usr/local/include/opencv4/",
                "-I","/usr/local/include/opencv4/opencv2",
 
                /* 项目所需的库文件路径 */
                "-L", "/usr/local/lib",
 
                /* OpenCV的lib库 */
                "/usr/local/lib/libopencv_*",
 
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}

launch:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",  //程序文件路径
            "args": [],  //程序运行需传入的参数
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": true,   //运行时是否显示控制台窗口
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

c_cpp_properties:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
            
                "/usr/local/include/opencv4"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu11",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

测试

费这么大劲装了contrib模块,赶快搞一个匹配算法来测试一下。

#include
#include         //SIFT SURF
 
#include
#include
 
constexpr auto path0 = "1.png";
constexpr auto path1 = "2.png";
 
int main() {
	cv::Mat image0 = cv::imread(path0, 1);
	cv::Mat image1 = cv::imread(path1, 1);
 
	cv::imshow("image0", image0);
	cv::imshow("image1", image1);
	/*
	step1:特征检测器
	*/
	cv::Ptr<cv::xfeatures2d::SURF> detector;
	detector = cv::xfeatures2d::SURF::create(800);  //800为海塞矩阵阈值,越大越精准
 
	/*
	-----SURF----
	cv::Ptr detector;
	detector = cv::xfeatures2d::SURF::create(800);  //800为海塞矩阵阈值,越大越精准
	-----SIFT-----
	cv::Ptr detector;
	detector = cv::xfeatures2d::SIFT::create(800);//800为保留的点数
	-----ORB------
	cv::Ptr detector;
	detector  = cv::ORB::create(800);//保留点数
	-----STAR-----
	cv::Ptr detector;
	detector = cv::xfeatures2d::StarDetector::create();
	-----MSD-----
	cv::Ptr detector;
	detector = cv::xfeatures2d::MSDDetector::create();
	*/
	std::vector <cv::KeyPoint > key0;
	std::vector <cv::KeyPoint > key1;
	detector->detect(image0,key0,cv::noArray());
	detector->detect(image1, key1, cv::noArray());
	
	/*
	step2:描述子提取器
	*/
	cv::Ptr<cv::xfeatures2d::SURF> Extractor;
	Extractor = cv::xfeatures2d::SURF::create(800);
	/*
       以下都是xfeature2d中的提取器
	-----SURF-----
	-----SIFT-----
	-----LUCID----
	-----BriefDescriptorExtractor----
	-----VGG-----
	-----BoostDesc-----
	*/
	cv::Mat descriptor0, descriptor1;
	Extractor->compute(image0, key0, descriptor0);
	Extractor->compute(image1, key1, descriptor1);
 
	/*
	step3:匹配器
	*/
	cv::BFMatcher matcher;//暴力匹配器
	std::vector<cv::DMatch> matches; // 存放匹配结果
	std::vector<cv::DMatch> good_matches; //存放好的匹配结果
 
	matcher.match(descriptor0, descriptor1, matches);             
	std::sort(matches.begin(), matches.end());     //筛选匹配点,根据match里面特征对的距离从小到大排序
 
	int ptsPairs = std::min(50, (int)(matches.size() * 0.15));
	std::cout << "匹配点数为" << ptsPairs << std::endl;
	for (int i = 0; i < ptsPairs; i++)
	{
		good_matches.push_back(matches[i]);              //距离最小的50个压入新的DMatch
	}
 
	cv::Mat result;
 
	cv::drawMatches(image0, key0,
		image1, key1,
		good_matches, result,
		cv::Scalar::all(-1), cv::Scalar::all(-1),
		std::vector<char>(),
		cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);  //绘制匹配点  
 
	cv::imshow("result", result);
	cv::waitKey(0);
}

ubuntu20.04+opencv4.5.4(contrib)+vscode配置_第5张图片
不管效果怎么样,总算是有结果了。

完结,撒花。

你可能感兴趣的:(操作踩坑,算法,c++,opencv,vscode)