解决C++ opencv的出现异常,segmentation fault问题
本人硕士毕业,刚进入公司,主管说做图像分割的深度学习算法。在硕士期间这些内容也看过做过不少,但都是用Python,pycharm pytorch或者tensorflow在windows系统上进行的,然而领导说未来主要使用C++在linux系统上进行,我直接头大,还好刚入职,不需要干活,主管给了些资料先看看,首先就是opencv的C++开发。
Python的opencv爷用的可熟了,本想着到c++应该基本相同,顶多语法API这些略有区别,然而在配置环境上直接烂掉。主管给我装了个虚拟机,需要在Ubuntu上配置环境,我这windows用烂了的人,换到linux系统上直接寄,在配置环境上顺着网上一点一点搜索,装好了VSCode, C++, opencv,也安装cmake什么的(说实话虽然装上了,我现在还不太能理解编译要干什么),然后配置用于编译的环境,主要还是根据网上的教程,配置tasks.json,c_cpp_properties.json,launch.json三个文件,网上各种教程给我看的头大,这里贴上三种配置方式(https://blog.csdn.net/qq_41968669/article/details/106352911),从网上搜的,大部分都一样。
c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/include/",
"/usr/local/include/opencv4",
"/usr/local/include/opencv4/opencv2"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "gnu++14",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "shell: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"`pkg-config", "--cflags", "--libs", "opencv4`",
],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program":"${fileDirname}/${fileBasenameNoExtension}.o",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
呐,我是头一次用linux的系统,我又是头一次配这种编译环境,我不知道其实有这个/usr/local/这个目录,是很正常的吧,因此我照葫芦画瓢,想这个usr/local应该是自己的下载目录,于是我把它改成了自己下载的路径xx/bb/下面(xxx是用户名,bb是自己建的文件夹),搞了大概半天,我才知道,原来有tm这个usr/local目录,所以我又直接复制他们的,发现可以打开图像,显示图像了,卧槽兴奋,这是第一个坑。
出现异常,segmentation fault问题
在我顺利的跟着教程往下的时候,遇到了第一个这个异常
Mat A = Mat(B.size(), B.type());
这里的B是一个Mat,我想创建 一个和B同大小,同类型的Mat,然而这么简单的一句,能报这个错,这个时候我先没想着解决这个错,我先换了种写法
Mat A = Mat(B.rows,B.cols, B.type());
竟然可以了,于是我觉得可能是opencv的版本装的不对,不支持这种.size()的表示了?想想又不太对,按理说.size更方便,不过我也不管这个了,继续往后面做,然后到这句
filter2D(src, dst,CV_8UC3, kernel);
同样,我也是跟着教程来,这句也是出现异常,segmentation fault,我进一步怀疑是opencv装错了,到后面发现用到gaussianblur这个函数的时候,又是这个错,我点进这个gaussianblur函数一看,这里面用到了filter2D这个函数,所以我最终把目光锁在了filter2D上,然而VScode也是头一次用,找不到他错误在哪,要是pycharm这分分钟解决。又经历了半天,我找到了是在一个叫imgproc模块的问题,看这个名字应该是图像处理相关的,所以这个filter2D函数应该在这里面,应该是这个文件有问题,所以我总是出错,因此我直接在文件夹中搜这个imgproc文件,一搜才知道,这里面竟然有两个imgproc文件,一个是在usr/local/include里面,一个是在usr/include/里面,而我的配置文件 c_cpp_properties.json和 tasks.json里面用的都是usr/local/include下的,所以我瞬间想到是不是这个问题,应该usr/include/这下面的才是正确的,果然我改了之后,所有的功能都可以使用了,歪日,这波给我整累了两天,不过好在解决了,虽然解决了,我还是不知道这两个目录下的区别,懂哥可以给我解释一波。
哎,想到后面要用C++做深度学习,不知道有多少这种低级问题等着我,心累。