文章目录
C++ 基础
Vector向量
int <-> string
int x1 = stoi(l4.c_str()); //c_str()返回的是一个临时指针,不能对其进行操作。
string s = tostring(x1);
手动编译
先准备好自己要编译的文件:main.cpp
gcc c语言,g++为c++.
在终端输入:
g++ main.cpp -o main.o 编译出可执行文件
./main.o 执行程序
最后 ,可以编写MakeFile文件:
可参考:https://www.cnblogs.com/wang_yb/p/3990952.html
编译C++版 Opencv
下载opencv 源码:e.g: (https://github.com/opencv/opencv/tree/3.4.11)
cd ~/opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8 # runs 8 jobs in parallel
sudo make install
vscode 配置并调试opencv代码
tasks可以被用来做编译,而launch用来执行编译好的文件。
1 先下载并编译C++ opencv
2 打开vscode ,写入自己要调试的程序:
#include <iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main(){
cout<<"hello world!"<<endl;
string path="000000.png";
Mat img = imread(path, 1);
imshow("img", img);
waitKey();
return 0;
}
ctrl+shift+P打开Command Palette,运行C/Cpp: Edit configurations...生成c_cpp_properties.json:
"includePath": [
"${workspaceFolder}/**",
"/usr/local/include"
]
编译:
sudo g++ demo.cpp -o demo `pkg-config opencv --cflags --libs`
运行:
./demo
3 配置launch.json
主要关注三个参数:
1)program
这一参数指明debug时运行哪个程序,“program”: “ w o r k s p a c e F o l d e r / {workspaceFolder}/ workspaceFolder/{fileBasenameNoExtension}.o”,表明是要运行当前目录中与被编译文件同名的.o后缀文件
2)MIMode
这一参数指明要使用的debug工具,Ubuntu环境下当然是gdb。win10环境下是MinGW,MacOS环境下是lldb。
3)miDebuggerPath
这一句也很重要。在默认生成的launch.json文件中并没有这一参数的设置语句,但这一句却是最重要的,因为有了这一句,vscode在编译运行cpp文件时才能找到gdb程序。
一般情况下,gdb是被安装在/usr/bin/gdb目录下,所以这一句为:“miDebuggerPath”: “/usr/bin/gdb”,
当然这里的理解都很粗浅,要详细了解launch.json文件,还是到扩展的官网上去看看。
设置好launch.json文件后,按道理已经可以试着运行cpp文件了,当然你一试vscode就会提示你不存在jiayiju${fileBasenameNoExtension}.o,因为我们还没有编译呢。
所以,要在launch.json中加一句"preLaunchTask": “g++”,,指定一个运行前任务,编译我们写好的cpp文件。
{
// 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",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
4 配置task.json
vscode使用快捷键 Ctrl + Shift + B 开启自动编译。
一般情况下,在上一步运行失败之后,会直接提示你设置task.json文件,如果没有,你也可以点击Ctrl+Shift+P"调出命令面板,然后搜索Task,点击第一个.
“label”: “build"表示以下是名为build的任务配置
“command”: “g++”,表示调用的编译器是g++
args表示command的命令,其中“-I”表示包含目录,”-L"表示库目录路径,"-l"表示库文件,注意:/usr/local/lib目录下的库文件名为libopencv_core.so,但是我们只需要写opencv_core就行了。添加好自己需要的库文件,然后调试&运行opencv_test.cpp就可以了。
${workspaceRoot} VS Code当前打开的文件夹
${file} 当前打开的文件
${relativeFile} 相对于workspaceRoot的相对路径
${fileBasename} 当前打开文件的文件名
${fileDirname} 所在的文件夹,是绝对路径
${fileExtname} 当前打开文件的拓展名,如.json
${cwd} the task runner’s current working directory on startup
{
// 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", "hello_world.cpp","-o","${fileBasenameNoExtension}.out",
"-I", "/usr/local/include",
"-I", "/usr/local/include/opencv",
"-I", "/usr/local/include/opencv2",
"-L", "/usr/local/lib",
"-l", "opencv_core",
"-l", "opencv_imgproc",
"-l", "opencv_imgcodecs",
"-l", "opencv_video",
"-l", "opencv_ml",
"-l", "opencv_highgui",
"-l", "opencv_objdetect",
"-l", "opencv_flann",
"-l", "opencv_imgcodecs",
"-l", "opencv_photo",
"-l", "opencv_videoio"
]
}
]
}
5 也可以不用json的方法 ,直接配置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把KaTeX parse error: Expected 'EOF', got '#' at position 29: …缀是.cpp的全部替换成.o #̲@是自动变量,指目标的名字TARGET
#KaTeX parse error: Expected 'EOF', got '#' at position 19: …所有前置条件,之间以空格分隔 #̲<指代第一个前置条件
参考:https://blog.csdn.net/qq849635649/article/details/51564338
https://blog.csdn.net/u012435142/article/details/82952302
单例
单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目。但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况,可能会优先考虑使用全局或者静态变量的方式,这样比较简单,也是没学过设计模式的人所能想到的最简单的方式了。
一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去new一个对象,即增加了开销,也使得代码更加臃肿。其实,我们只需要一个实例对象就可以。如果采用全局或者静态变量的方式,会影响封装性,难以保证别的代码不会对全局变量造成影响。
考虑到这些需要,我们将默认的构造函数声明为私有的,这样就不会被外部所new了,甚至可以将析构函数也声明为私有的,这样就只有自己能够删除自己了。在Java和C#这样纯的面向对象的语言中,单例模式非常好实现,直接就可以在静态区初始化instance,然后通过getInstance返回,这种就被称为饿汉式单例类。也有些写法是在getInstance中new instance然后返回,这种就被称为懒汉式单例类,但这涉及到第一次getInstance的一个判断问题。
下面的我在定QT是传输深度学习标签值时用的代码:
<single.h>
#ifndef SINGLE_H
#define SINGLE_H
#include <QObject>
#include <QMutex>
class Single
{
public:
~Single();
static Single* GetInstance();
QList<QVariant> Get_file_data();
private:
Single();
static Single* m_instance;
static QMutex m_mutex;
};
#endif // SINGLE_H
//**<single.cpp>*********************************************************************
#include "single.h"
#include "extract_file.h"
Single* Single::m_instance = nullptr;
QMutex Single::m_mutex;
Single::Single()
{
}
Single::~Single()
{
if(m_instance)
{
m_mutex.unlock();
delete m_instance;
}
}
Single *Single::GetInstance()
{
if (m_instance == nullptr)
{
QMutexLocker locker(&m_mutex);
if (m_instance == nullptr)
{
m_instance = new Single();
}
}
return m_instance;
}
QList<QVariant> Single::Get_file_data()
{
QString label_path="E:/datasets/VOCdevkit/VOC2011_2012/Annotations/2011_000003.xml";
Extract_file *extracter= new Extract_file();
extracter->do_run(label_path);
}
图像的基础操作(read, write, attributes, pixels…)
#include <iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include"cv_tools.h"
using namespace std;
using namespace cv;
void im_read()
{
string path="000000.png";
Mat img = imread(path, 1);
if(img.empty()) //判断是否为空
{
cout<<"can not load image"<<endl;
}
Mat pic = imread("000000.jpg", 2 | 4); // read lossless img, flag<0: 读取无损图像
Mat pic1 = imread("000000.jpg", 0); // read gray img, flag=0: 读取灰度图
Mat pic2 = imread("000000.jpg", 1); // read 3 channels img, flag>0: 读取三通道图像(RGB)
// 第三个参数:jpg(0-100, 图片质量, default:95)
// png(0 - 9), 越高尺寸越小, 默认3
// pgm/pbm(0 或 1)二进制格式标尺,默认1
imshow("window_name",