之前一直在windows上用Visual studio配置opencv,现在经常使用Ubuntu系统,也需要编写opencv C++代码。当然使用Qt creator配置opencv环境是一种选择,只需要在.pro文件中增加引用目录和库目录就行:
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2
LIBS += /usr/local/lib/libopencv_highgui.so \
/usr/local/lib/libopencv_video.so \
/usr/local/lib/libopencv_videoio.so \
/usr/local/lib/libopencv_core.so \
/usr/local/lib/libopencv_imgproc.so \
/usr/local/lib/libopencv_imgcodecs.so #按照项目需要添加库文件,不必全部添加
我平时更喜欢使用VScode,所以也把VScode的opencv配置了一遍,下面介绍一下主要步骤。
注意:本教程需要当前linux已经安装好opencv,即opencv库文件存在/usr/local/lib目录下;当然如果是自定义的目录,那么修改教程中的相应目录即可。
如果opencv安装在了默认目录/usr/local,那么VScode会自动搜索该目录,实现opencv自动补全和智能提示;否则,需要配置c_cpp_properties.json文件,将includePath配置为opencv安装目录。
#include
#include
using namespace cv;
int main()
{
Mat img=imread("/media/han/E/mWork/datasets/opencv/HappyFish.jpg");
cv::imshow("image",img);
cv::waitKey();
return 0;
}
打开launch.json的方法:Ctrl +Shift +P ,输入launch,选择Debug:open launch.json
{
// 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": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}.o",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "build",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
${workspaceFolder}
表示当前工作目录,{fileBasenameNoExtension}
表示当前文件名,不包括扩展
"program": "${workspaceFolder}/${fileBasenameNoExtension}.o",
表示生成的执行文件在当前目录下,和当前文件同名,只是扩展为.o;例如本教程会生成opencv_test.o执行文件。
VS code中预定义路径相关变量
workspaceFolder
workspaceFolder
"preLaunchTask": "build",
是默认launch.json中没有的,表示执行文件前需要的编译任务。具体的任务内容我们在task.json中定义。
打开tasks.json的方法:Ctrl +Shift +P ,输入task,选择Tasks:Configure Task
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "g++",
"args": [ "-g", "${file}","-o","${fileBasenameNoExtension}.o",
"-I","/usr/local/include",
"-I","/usr/local/include/opnecv",
"-I","/usr/local/include/opnecv2",
"-L","/usr/local/lib",
"-l","opencv_core",
"-l","opencv_highgui",
"-l","opencv_imgproc",
"-l","opencv_imgcodecs"
]
}
]
}
"label": "build"
表示以下是名为build
的任务配置
"command": "g++",
表示调用的编译器是g++
args
表示command的命令,其中“-I”
表示包含目录,"-L"
表示库目录路径,"-l"
表示库文件,注意:/usr/local/lib目录下的库文件名为libopencv_core.so,但是我们只需要写opencv_core就行了。添加好自己需要的库文件,然后调试&运行opencv_test.cpp就可以了。
Makefile文件如下:
CROSS =
CC = $(CROSS)gcc
CXX = $(CROSS)g++
DEBUG = -g -O2
CFLAGS = $(DEBUG) -Wall -c
RM = rm -rf
SRCS = $(wildcard ./*.cpp)
OBJS = $(patsubst %.cpp, %.o, $(SRCS))
HEADER_PATH = -I/usr/local/include/ -I/usr/local/opencv -I/usr/local/opencv2
LIB_PATH = -L/usr/local/lib
LIBS = -lopencv_core -lopencv_highgui -lopencv_imgcodecs
VERSION = 1.0
TARGET = test_$(VERSION)
$(TARGET) : $(OBJS)
$(CXX) $^ -o $@ $(LIB_PATH) $(LIBS)
$(OBJS):%.o : %.cpp
$(CXX) $(CFLAGS) $< -o $@ $(HEADER_PATH)
.PHONY: clean
clean :
-$(RM) $(TARGET) *.o
wildcard
通配符,wildcard
把指定目录./下的所有后缀是cpp的文件全部展开;获取工作目录下的所有的.cpp文件列表
patsubst
替换通配符,patsubst
把$(SRCS)
中的变量符合后缀是.cpp的全部替换成.o
#$@
是自动变量,指目标的名字TARGET
#$^
指代所有前置条件,之间以空格分隔
#$<
指代第一个前置条件
https://blog.csdn.net/qq849635649/article/details/51564338
https://seisman.github.io/how-to-write-makefile/variables.html#id7
https://code.visualstudio.com/docs/editor/variables-reference