# 解决C++ opencv的出现异常,segmentation fault问题

解决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++做深度学习,不知道有多少这种低级问题等着我,心累。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值