C + + 与T R C V(持续更新)

C++ 基础

Vector向量

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",
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值