基本思想:编译一个含有opencv第三方的静态库,提供给go语言多路视频并发采集,然后调用c++的ncnn.a进行检测和分析数据(前提你已经安装了mingw32,同时使用mingw32编译了opencv);
安装mingw版本
C:\Users\l>g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=C:/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-7.3.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw730/x86_64-730-posix-sjlj-rt_v5-rev0/mingw64 --enable-shared --enable-static --enable-targets=all --enable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --enable-sjlj-exceptions --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch-32=i686 --with-arch-64=nocona --with-tune-32=generic --with-tune-64=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-sjlj-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-sjlj-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-sjlj-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw730/x86_64-730-posix-sjlj-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw730/x86_64-730-posix-sjlj-rt_v5-rev0/mingw64/opt/lib -L/c/mingw730/prerequisites/x86_64-zlib-static/lib -L/c/mingw730/prerequisites/x86_64-w64-mingw32-static/lib '
Thread model: posix
gcc version 7.3.0 (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project)
一、测试一个完整的clion工程,读取图片并写入本地代码
cmakelists.txt
cmake_minimum_required(VERSION 3.16)
project(untitled6)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
set(OpenCV_DIR "D:\\Opencv440\\buildMinGW")#改为mingw-bulid的位置
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# add libs you need
include_directories(${CMAKE_SOURCE_DIR}/include)
add_executable(untitled6 main.cpp processImage.cpp processImage.h)
target_link_libraries(untitled6 ${OpenCV_LIBS})
main.cpp
#include "processImage.h"
int main(int argc, char *argv[])
{
std::string src="F:\\1.png";
std::string dst="img.jpg";
int ok=process(src, dst);
std::cout<<ok<<std::endl;
return 0;
}
processimage.h
//
// Created by sxj on 2021/9/4.
//
#ifndef UNTITLED6_PROCESSIMAGE_H
#define UNTITLED6_PROCESSIMAGE_H
#include <opencv2/core.hpp> //Mat 核心库
#include <opencv2/imgcodecs.hpp> //imread 读图片函数
#include <opencv2/highgui.hpp> //namedWindow imshow waitKey 界面
#include <opencv2\imgproc.hpp> //图像处理
#include<iostream>
using namespace cv;
int process(std::string src,std::string dst);
#endif //UNTITLED6_PROCESSIMAGE_H
processimage.cpp
//
// Created by sxj on 2021/9/4.
//
#include "processImage.h"
int process(std::string src,std::string dst){
Mat image = imread(src); //读取一张图片
//打开一个窗体
imwrite(dst, image); //通过img窗体显示image图片
//界面的刷新,获取键盘的输入
return 0;
}
测试一个独立的工程没有问题~
二、创建一个clion的库工程 ,并进行静态库的生成,生成静态库的代码来自上面叙述的独立工程
二、修改静态库生成工程
cmakelists.txt
cmake_minimum_required(VERSION 3.16)
project(untitled5)
set(CMAKE_CXX_STANDARD 14)
set(OpenCV_DIR "D:\\Opencv440\\buildMinGW")#改为mingw-bulid的位置
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# add libs you need
include_directories(${CMAKE_SOURCE_DIR}/include)
add_library(untitled5 library.cpp library.h)
library.h
//
// Created by sxj on 2021/9/4.
//
#ifndef UNTITLED6_PROCESSIMAGE_H
#define UNTITLED6_PROCESSIMAGE_H
#include <opencv2/core.hpp> //Mat 核心库
#include <opencv2/imgcodecs.hpp> //imread 读图片函数
#include <opencv2/highgui.hpp> //namedWindow imshow waitKey 界面
#include <opencv2\imgproc.hpp> //图像处理
#include<iostream>
using namespace cv;
int process(std::string src,std::string dst);
#endif //UNTITLED6_PROCESSIMAGE_H
library.cpp
//
// Created by sxj on 2021/9/4.
//
#include "library.h"
int process(std::string src,std::string dst){
Mat image = imread(src); //读取一张图片
//打开一个窗体
imwrite(dst, image); //通过img窗体显示image图片
//界面的刷新,获取键盘的输入
return 0;
}
点击ctrl+f9进行静态库的生成
三。然后将生成的静态库导入新工程中,先测试一下,然后就可以导入go工程中进行联合编译
main.cpp
#include "processImage.h"
int main(int argc, char *argv[])
{
std::string src="F:\\1.png";
std::string dst="img.jpg";
int ok=process(src, dst);
std::cout<<ok<<std::endl;
return 0;
}
processimage.h
//
// Created by sxj on 2021/9/4.
//
#ifndef UNTITLED6_PROCESSIMAGE_H
#define UNTITLED6_PROCESSIMAGE_H
#include <opencv2/core.hpp> //Mat 核心库
#include <opencv2/imgcodecs.hpp> //imread 读图片函数
#include <opencv2/highgui.hpp> //namedWindow imshow waitKey 界面
#include <opencv2\imgproc.hpp> //图像处理
#include<iostream>
using namespace cv;
int process(std::string src,std::string dst);
#endif //UNTITLED6_PROCESSIMAGE_H
cmakelists.txt
cmake_minimum_required(VERSION 3.16)
project(untitled6)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
set(OpenCV_DIR "D:\\Opencv440\\buildMinGW")#改为mingw-bulid的位置
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# add libs you need
include_directories(${CMAKE_SOURCE_DIR}/include)
add_library(libuntitled5 STATIC IMPORTED)
set_target_properties(libuntitled5 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libuntitled5.a)
add_executable(untitled6 main.cpp processImage.h)
target_link_libraries(untitled6 ${OpenCV_LIBS} libuntitled5)
整个目录结构如下
执行结果就可以了,图片写入本地,同时返回了数据;
四、先测试一个简单的vscode的c++代码,创建一个vscode工程,使用vscode的主要原因是,因为其它同时需要写go语言,然后和我的检测端代码进行联调,使用go的原因是可以对视频多路并发更容易~
其工程目录
launch.json文件内容
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true, //控制台输出,false则不显示终端窗口
"MIMode": "gdb",
"miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe", //修改成你自己的路径
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "gcc.exe build active file"//该处一定要与tasks.json的lable一致
}
]
}
tasks.json文件内容
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "gcc.exe build active file",//一定与preLaunchTask一致
"command": "C:\\MinGW\\bin\\g++.exe", //改为你自己的路径
"args": [
"-g",
"${file}",
// "${fileDirname}\\printf.c",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "C:\\MinGW\\bin" //改为自己的路径的bin文件夹
},
"problemMatcher": [
"$gcc"
],
"group": "build"
}
]
}
测试代码main.cpp
#include <iostream>
using namespace std;
int main() {
std::cout << "hello world!" << std::endl;
return 0;
}
测试结果
PS F:\vscodeCode> cd "f:\vscodeCode\" ; if ($?) { g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile } ; if ($?) { .\tempCodeRunnerFile }
hello world!
PS F:\vscodeCode>
五、然后修改一下测试一下opencv的调用 (本菜鸡电脑用mingw32编译两套opencv ,一套是D:\\Opencv440\\buildMGW,一套是c:\\opencv\\buildMGW,所以引用哪个都可以,莫怪)
c_cpp_properties.json 文件内容
{
"configurations": [
{
"name": "win",
"includePath": [
"${workspaceFolder}/**",
"C:\\opencv\\buildMinGW\\install\\include",
"C:\\opencv\\buildMinGW\\install\\include\\opencv2"
],
"defines": [],
"compilerPath": "C:\\mingw64\\bin\\gcc.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
tasks.json文件内容
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "gcc.exe build active file",//一定与preLaunchTask一致
"command": "C:\\mingw64\\bin\\g++.exe", //改为你自己的路径
"args": [
"-g",
"-std=c++11",
"${file}",
// "${fileDirname}\\printf.c",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-I", "C:\\opencv\\buildMinGW\\install\\include",
"-I", "C:\\opencv\\buildMinGW\\install\\include\\opencv2",
"-L", "C:\\opencv\\buildMinGW\\install\\x64\\mingw\\lib",
"-l", "libopencv_core452",
"-l", "libopencv_imgproc452",
"-l", "libopencv_imgcodecs452",
"-l", "libopencv_video452",
"-l", "libopencv_ml452",
"-l", "libopencv_highgui452",
"-l", "libopencv_objdetect452",
"-l", "libopencv_flann452",
"-l", "libopencv_imgproc452",
"-l", "libopencv_photo452",
"-l", "libopencv_videoio452"
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "new", //这里shared表示共享,改成new之后每个进程创建新的端口
"showReuseMessage": true,
"clear": false
},
"options": {
"cwd": "C:\\mingw64\\bin" //改为自己的路径的bin文件夹
},
"problemMatcher": [
"$gcc"
],
"group": "build"
}
]
}
launch.json文件内容
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true, //控制台输出,false则不显示终端窗口
"MIMode": "gdb",
"miDebuggerPath": "C:\\mingw64\\bin\\gdb.exe", //修改成你自己的路径
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "gcc.exe build active file"//该处一定要与tasks.json的lable一致
}
]
}
main.cpp代码文件
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("G:\\1.png");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", src);
waitKey(0);
return 0;
}
测试结果
Thread 1 hit Breakpoint 1, main (argc=1, argv=0x2e32f20) at g:\vscodeProject\main.cpp:9
9 Mat src = imread("G:\\1.jpg");
Loaded 'C:\WINDOWS\SYSTEM32\ntdll.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\System32\kernel32.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\System32\KernelBase.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\SYSTEM32\apphelp.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\System32\msvcrt.dll'. Symbols loaded.
Loaded 'C:\mingw64\bin\libstdc++-6.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\System32\user32.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\System32\win32u.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\System32\gdi32.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\System32\gdi32full.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\System32\msvcp_win.dll'. Symbols loaded.
Loaded 'C:\WINDOWS\System32\ucrtbase.dll'. Symbols loaded.
测试图片:
六、 测试一下我上面编译的库问题,进行联调
将本菜鸡一开始使用clion生成静态库拷贝到vscode工程中
工程目录
修改文件tasks.json内容
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "gcc.exe build active file",//一定与preLaunchTask一致
"command": "C:\\mingw64\\bin\\g++.exe", //改为你自己的路径
"args": [
"-g",
"-std=c++11",
"${file}",
// "${fileDirname}\\printf.c",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-I", "C:\\opencv\\buildMinGW\\install\\include",
"-I", "C:\\opencv\\buildMinGW\\install\\include\\opencv2",
"-I", "G:\\vscodeProject\\include",//头文件所在目录
"-L", "C:\\opencv\\buildMinGW\\install\\x64\\mingw\\lib",
"G:\\vscodeProject\\lib\\libuntitled5.a",
"-l", "libopencv_core452",
"-l", "libopencv_imgproc452",
"-l", "libopencv_imgcodecs452",
"-l", "libopencv_video452",
"-l", "libopencv_ml452",
"-l", "libopencv_highgui452",
"-l", "libopencv_objdetect452",
"-l", "libopencv_flann452",
"-l", "libopencv_imgproc452",
"-l", "libopencv_photo452",
"-l", "libopencv_videoio452",
"-l", "libopencv_videoio452",
//库所在的目录
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "new", //这里shared表示共享,改成new之后每个进程创建新的端口
"showReuseMessage": true,
"clear": false
},
"options": {
"cwd": "C:\\mingw64\\bin" //改为自己的路径的bin文件夹
},
"problemMatcher": [
"$gcc"
],
"group": "build"
}
]
}
修改c_cpp_properties.json文件内容
{
"configurations": [
{
"name": "win",
"includePath": [
"${workspaceFolder}/**",
"C:\\opencv\\buildMinGW\\install\\include",
"C:\\opencv\\buildMinGW\\install\\include\\opencv2",
"G:\\vscodeProject\\include"//头文件所在目录
],
"defines": [],
"compilerPath": "C:\\mingw64\\bin\\gcc.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
launch.json文件内容未变
测试截图为
本地也会写成功一张为2.jpg的图片
项目主要目的进行go语言进行并发调用视频,然后通过ncnn.a进行检测