OpenCV C++ 版本基本入门

1. 构建基于CMake的Task.json文件

可执行文件那里更改demo就可以更改可执行文件的名称, 如果这里更改了luanch.json也是要更改的

{
    
    
	"version": "2.0.0",
	"tasks": [
		// 1. cmake 配置
		{
    
    
			"label": "cmake 配置",
			"type": "shell",
			"command": "cmake -B build -S . -DCMAKE_BUILD_TYPE=Debug",
			"problemMatcher": [],
			"group": {
    
    
				"kind": "build",
				"isDefault": true
			},
			"options": {
    
    
				"cwd": "${workspaceFolder}"
			}
		},
		// 2. cmake 构建
		{
    
    
			"label": "cmake 构建",
			"type": "shell",
			"command": "cmake --build build",
			"problemMatcher": [],
			"group": {
    
    
				"kind": "build",
				"isDefault": true
			},
			"options": {
    
    
				"cwd": "${workspaceFolder}"
			},
			"dependsOn": [
				"cmake 配置"
			]
		},
		// 3. 删除build 目录
		{
    
    
			"label": "删除build 目录",
			"type": "shell",
			"command": "rm -rf build",
			"problemMatcher": [],
			"group": {
    
    
				"kind": "build",
				"isDefault": true
			},
			"options": {
    
    
				"cwd": "${workspaceFolder}"
			}
		},
		// 4. 运行可执行文件
		{
    
    
			"label": "运行可执行文件",
			"type": "shell",
			"command": "./build/demo_${fileBasenameNoExtension}",
			"problemMatcher": [],
			"group": {
    
    
				"kind": "build",
				"isDefault": true
			},
			"options": {
    
    
				"cwd": "${workspaceFolder}"
			},
			"dependsOn": [
				"cmake 构建"
			]
		}

	]
}

2. 构建基于CMake的c_cpp_properties.json文件

{
    
    
    "configurations": [
        {
    
    
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include/opencv4"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

3. 构建基于CMake的launch.json文件

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "C++ CMake Debug",
            "program": "${workspaceFolder}/build/demo_${fileBasenameNoExtension}",
            "args": [],
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "cmake 构建",
        }
    ]
}

4. setting.json

{
    
    
    "files.associations": {
    
    
        "array": "cpp",
        "atomic": "cpp",
        "*.tcc": "cpp",
        "cctype": "cpp",
        "chrono": "cpp",
        "clocale": "cpp",
        "cmath": "cpp",
        "complex": "cpp",
        "condition_variable": "cpp",
        "cstdarg": "cpp",
        "cstddef": "cpp",
        "cstdint": "cpp",
        "cstdio": "cpp",
        "cstdlib": "cpp",
        "cstring": "cpp",
        "ctime": "cpp",
        "cwchar": "cpp",
        "cwctype": "cpp",
        "deque": "cpp",
        "list": "cpp",
        "unordered_map": "cpp",
        "vector": "cpp",
        "exception": "cpp",
        "algorithm": "cpp",
        "functional": "cpp",
        "iterator": "cpp",
        "map": "cpp",
        "memory": "cpp",
        "memory_resource": "cpp",
        "numeric": "cpp",
        "optional": "cpp",
        "random": "cpp",
        "ratio": "cpp",
        "set": "cpp",
        "string": "cpp",
        "string_view": "cpp",
        "system_error": "cpp",
        "tuple": "cpp",
        "type_traits": "cpp",
        "utility": "cpp",
        "fstream": "cpp",
        "initializer_list": "cpp",
        "iomanip": "cpp",
        "iosfwd": "cpp",
        "iostream": "cpp",
        "istream": "cpp",
        "limits": "cpp",
        "mutex": "cpp",
        "new": "cpp",
        "ostream": "cpp",
        "sstream": "cpp",
        "stdexcept": "cpp",
        "streambuf": "cpp",
        "thread": "cpp",
        "cinttypes": "cpp",
        "typeinfo": "cpp",
        "bit": "cpp"
    }
}

5. Cmake构建图片读取保存的demo

# 最低版本要求
cmake_minimum_required(VERSION 3.10)

# 项目信息
project(opencv_demo)

# 使用find_package命令查找OpenCV库
find_package(OpenCV REQUIRED)
find_package(gflags REQUIRED)

if (OpenCV_FOUND)
    message(STATUS "OpenCV library status:")
    message(STATUS "    version: ${OpenCV_VERSION}")
    message(STATUS "    libraries: ${OpenCV_LIBS}")
    message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
else()
    message(FATAL_ERROR "Could not find OpenCV library")
endif()

# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS} ${gflags_INCLUDE_DIRS})
# 链接库
link_libraries(${OpenCV_LIBS} ${gflags_LIBRARIES})

# 添加可执行文件
add_executable(demo_1.img src_back/1.img.cpp)
add_executable(demo_2.video src_back/2.video.cpp)
add_executable(demo_3.camera src_back/3.camera.cpp)
/*
图片的读取和显示
*/
#include "opencv2/opencv.hpp"
#include <iostream>
#include <stdio.h>

int main(int argc, char** argv)
{
    
    
	// 读取图片, mat是matrix的缩写, 是一个矩阵, 跟python接口一样, python用numpy储存的
	cv::Mat image = cv::imread("./media/cat.jpg");
	// 判断是否读取成功
	if (image.empty())
	{
    
    
		printf("Cannot Read the images\n");
		return -1;
	}

	// print rows and cols
	printf("图片高度: %d \n图片宽度:  %d\n", image.rows, image.cols);

	// 以numpy 和 python两种方式打印图片
	#if 0
	// 以numpy的形式打印图片
	std::cout << cv::format(image, cv::Formatter::FMT_NUMPY) << std::endl;

	// 以python list的方式打印
	std::cout << cv::format(image, cv::Formatter::FMT_PYTHON) << std::endl;
	#endif
	
	// 创建一个灰度图, 数据类型是Mat
	cv::Mat gray;
	// 转换图像格式
	cv::cvtColor(image, gray, cv::COLOR_RGB2GRAY);

	// 保存
	cv::imwrite("./output1/gray.jpg", gray);

	return 0;
}

7. Cmake构建视频处理的demo

.vscode文件沿用

// 导入opencv 库
#include <opencv2/opencv.hpp>
#include <iostream>
// 导入gflags 库
#include <gflags/gflags.h>
// 定义命令行参数
DEFINE_int32(camera, 0, "Input camera"); // 摄像头编号

int main(int argc, char **argv)
{
    
    
    // 解析命令行参数
    gflags::ParseCommandLineFlags(&argc, &argv, true);
    // 读取视频:创建了一个VideoCapture对象,参数为摄像头编号
    cv::VideoCapture capture(FLAGS_camera);
    // 设置指定摄像头的分辨率
    int width = 640;
    int height = 480;

    // 设置摄像头宽度和高度
    capture.set(cv::CAP_PROP_FRAME_WIDTH, width);
    capture.set(cv::CAP_PROP_FRAME_HEIGHT, height);

    // 判断视频是否读取成功,返回true表示成功
    if (!capture.isOpened())
    {
    
    
        std::cout << "无法打开摄像头: " << FLAGS_camera << std::endl;
        return 1;
    }
    // 读取视频帧,使用Mat类型的frame存储返回的帧
    cv::Mat frame;
    // 写入MP4文件,参数分别是:文件名,编码格式,帧率,帧大小
    cv::VideoWriter writer("./output/record.mp4", cv::VideoWriter::fourcc('H', '2', '6', '4'), 20, cv::Size(width, height));

    // 循环读取视频帧
    while (true)
    {
    
    
        // 读取视频帧,使用 >> 运算符或者read()函数,他的参数是返回的帧
        capture.read(frame);
        // capture >> frame;
        // flip
        cv::flip(frame, frame, 1);
        // 显示视频帧
        cv::imshow("opencv demo", frame);
        // 写入视频
        writer.write(frame);
        // 等待按键,延迟30ms,否则视频播放太快
        int k = cv::waitKey(30);
        // 按下ESC键退出
        if (k == 27)
        {
    
    
            std::cout << "退出" << std::endl;
            break;
        }
    }

    return 0;
}

8. 图像处理


// opencv 调整颜色
#include "opencv2/opencv.hpp"
#include <iostream>

int main()
{
    
    
    // 读取图片, OpenCV读进来的BGR
    cv::Mat src = cv::imread("./media/openAI.png");

    // BGR -> RGB
    cv::Mat rgb_image;
    cv::cvtColor(src, rgb_image, cv::COLOR_BGR2RGB);

    // 转换成gray
    cv::Mat gray_image;
    cv::cvtColor(src, gray_image, cv::COLOR_BGR2GRAY);

    // 转换成HSV: Hue(色调)、Saturation(饱和度)、Value(明度)
    cv::Mat hsv_image;
    cv::cvtColor(src, hsv_image, cv::COLOR_BGR2HSV);

    // 图片保存
    cv::imwrite("./output/1.RGB.jpg", rgb_image);
    cv::imwrite("./output/1.BGR.jpg", src);
    cv::imwrite("./output/1.gray.jpg", gray_image);
    cv::imwrite("./output/1.hsv.jpg", hsv_image);

    return 0;
}

9. 颜色过滤

膨胀、腐蚀和高斯模糊都是图像处理中常用的操作。

膨胀和腐蚀是形态学操作,用于改变图像的形状和大小。膨胀可以使图像中的白色区域变大,黑色区域变小,而腐蚀则相反,可以使白色区域变小,黑色区域变大。这两种操作通常用于去除图像中的噪声或者分离出图像中的某些部分。

高斯模糊是一种平滑滤波器,可以用于去除图像中的噪声或者模糊图像。它通过对每个像素周围的像素进行加权平均来实现。这种加权平均使得离中心像素越远的像素对中心像素的影响越小,从而达到平滑图像的目的。

// opencv 图像滤波
#include "opencv2/opencv.hpp"
#include <iostream>


int main()
{
    
    
    // 读取图片
    cv::Mat src = cv::imread("./media/dog.jpg");
    // 高斯模糊
    cv::Mat blur;
    // 三个参数分别是输入图像、输出图像、卷积核大小
    cv::GaussianBlur(src, blur, cv::Size(7, 7), 0);

    // 膨胀
    cv::Mat dilate;
    // 三个参数分别是输入图像、输出图像、卷积核大小
    cv::dilate(src, dilate, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)));

    // 腐蚀
    cv::Mat erode;
    // 三个参数分别是输入图像、输出图像、卷积核大小
    cv::erode(src, erode, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)));

    // 保存
    cv::imwrite("./output/2.blur.jpg", blur);
    cv::imwrite("./output/2.dilate.jpg", dilate);
    cv::imwrite("./output/2.erode.jpg", erode);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/bobchen1017/article/details/129804643