首页 > 系统相关 >Windows10+VSCode+cmake+opencv+ffmpeg+sdl2环境配置

Windows10+VSCode+cmake+opencv+ffmpeg+sdl2环境配置

时间:2023-11-10 17:11:38浏览次数:48  
标签:bin cmake ffmpeg sdl2 dev opencv include DIR

一、概述

  在Windows10上配置一个C++开发环境:

    工具:VSCode

    编译器:Mingw64(使用gcc进行编译)

    构建工具:CMake

    第三方库:集成OpenCV、FFmpeg、SDL2

二、操作步骤

  1.安装mingw64并配置bin目录到环境变量

  2.下载VSCode并安装

  3.安装CMake并将bin目录配置到环境变量

  4.下载OpenCV、FFmpeg、SDL2库备用

  5.安装VSCode插件

  6.Ctrl+Shift+P配置C++头文件路径,如果不配置则没有代码提示

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "D:/ffmpeg/dev/SDL2-2.28.5-dev/x86_64-w64-mingw32/include",
                "D:/opencv/build_install/install/include",
                "D:/ffmpeg/dev/ffmpeg-5.1.2-dev/include",
                "E:/tony/demo/script/cmake_demo/cmake_opencv/src"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "D:/mingw64/bin/gcc.exe",
            "cStandard": "c89",
            "cppStandard": "gnu++98",
            "intelliSenseMode": "windows-gcc-x86"
        }
    ],
    "version": 4
} 

  7.创建一个CMakeLists.txt构建项目

#参考样例(Cmake保姆级教程):https://subingwen.cn/cmake/CMake-primer/
cmake_minimum_required(VERSION 3.0.0)
#设置C++的编译版本,其中CMAKE_CXX_STANDARD是固定的,11代表C++11
set(CMAKE_CXX_STANDARD 11)

#设置项目名称
project(opencv_demo VERSION 0.1.0)

#定义一个宏在代码中使用
# add_definitions(-DDEBUG)

#include(CTest)
#enable_testing()

set(CURRENT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
message("项目当前路径,也就是CMakeLists.txt所在的路径:"${CURRENT_DIR})
#设置可执行文件的输出路径,会在bin目录下输出scrcpy_demo.exe
set(EXECUTABLE_OUTPUT_PATH ${CURRENT_DIR}/bin)

#生成一个可构建的执行程序,在根目录下的build文件夹
#这里的项目名scrcpy_demo和project中的(scrcpy_demo)没有一毛钱关系
#设置源码路径
# set(SRC_LIST main.cpp)
#包含头文件(其實就是搜索頭文件)
# include_directories(${PROJECT_SOURCE_DIR}/src)
# #搜索源文件 SRC_LIST代表變量名
# file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c)
# message("搜索源码Lu经:"${SRC_LIST})
##############添加opencv相关类库的支持

#编译opencv(opencv引入始终不成功)
include_directories("D:/opencv/build_install/install/include")
link_directories("D:/opencv/build_install/install/x64/mingw/bin")

#导入sdl2
include_directories("D:/ffmpeg/dev/SDL2-2.28.5-dev/x86_64-w64-mingw32/include")
link_directories("D:/ffmpeg/dev/SDL2-2.28.5-dev/x86_64-w64-mingw32/bin")

#导入ffmpeg
include_directories("D:/ffmpeg/dev/ffmpeg-5.1.2-dev/include")
link_directories("D:/ffmpeg/dev/ffmpeg-5.1.2-dev/bin")


# file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cpp ${PROJECT_SOURCE_DIR}/*.h)
# set(SRC_1 main.cpp)
#搜索src目录下的源文件
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/sdl/include)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src/sdl SRC_LIST)
#生成可執行文件
add_executable(opencv_demo main.cpp ${SRC_LIST})

target_link_libraries(opencv_demo 
SDL2 
libopencv_calib3d453
libopencv_features2d453
libopencv_gapi453
libopencv_flann453
libopencv_core453 
libopencv_dnn453 
libopencv_ml453
libopencv_highgui453 
libopencv_imgcodecs453 
libopencv_imgproc453 
#引入ffmpeg
avformat-59 
avutil-57 
avcodec-59 
avdevice-59 
avfilter-8 

)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
#message用于输出信息
message("项目名称:"${PROJECT_NAME})
message("项目版本:"${PROJECT_VERSION})
message("项目源码路径"${PROJECT_SOURCE_DIR})

#[[
    这是一个多行注释
]]

  8.创建一个shell脚本用于执行CMakeLists.txt

#!/usr/bin/env bash
#自动化运行的脚本
BUILD_DIR='build'
#删除build目录
rm -rf $BUILD_DIR
#重新编译 -B build代表编译文件存放目录
cmake -B build -G "MinGW Makefiles"
echo $BUILD_DIR
#进入build目录
cd $BUILD_DIR
#执行make编译
mingw32-make
#运行可执行文件
../bin/opencv_demo.exe
# ./opencv_demo.exe

  9.创建一个main.cpp进行测试:ps:测试代码是在网上随便找的

    1.测试OpenCV显示一个图片

    2.测试SDL2创建一个原生窗口

    3.测试打印ffmpeg的codec的版本号

#include <iostream>
#include <opencv2/opencv.hpp>
#include "SDL2/SDL.h"
extern "C"{
#include <libavcodec/avcodec.h>
}
#include "create_window.h"


using namespace std;
using namespace cv;
#undef main
int main(int argc, char *argv[]){

    // CreateWindow *window = new CreateWindow();
    // window->showWindow();

    cout<< "hello world" <<endl;
    cv::Mat src = cv::imread("e:/tony/demo/script/cmake_demo/cmake_opencv/horse.jpeg");
    if(src.empty()){
        cout << "this image is empty"<<endl;
    }
    // cvtColor(src,COLOR_BGR2GRAY);
    cv::imshow("src",src);
    cv::waitKey(0);


    // cout <<"Hello SDL2"<< endl;
     //创建一个SDL_VIDEO窗口
    SDL_Window* window = NULL;
    SDL_Renderer *renderer = NULL;//渲染器
    SDL_Texture *texture = NULL;//纹理
    SDL_Init(SDL_INIT_VIDEO);
    window = SDL_CreateWindow("Title",
                              SDL_WINDOWPOS_UNDEFINED, // 默认x y 显示到窗口中间
                              SDL_WINDOWPOS_UNDEFINED,
                              640,
                              480,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);// 设置窗口属性
    if(!window){
        printf("不能创建window,%s",SDL_GetError());
    }
    //创建渲染器(一个窗口可以有多个渲染器)
    renderer = SDL_CreateRenderer(window,-1,0);
    if(NULL==renderer){
        printf("渲染器创建失败:%s",SDL_GetError());
        //销毁窗口释放资源
        SDL_DestroyWindow(window);
        SDL_Quit();
        return -1;
    }
    //基于渲染器创建纹理
    texture = SDL_CreateTexture(renderer,
    SDL_PIXELFORMAT_RGBA8888,
    SDL_TEXTUREACCESS_TARGET,
    640,
    480);
    if(NULL==texture){
        printf("纹理创建失败:%s",SDL_GetError());
        //销毁窗口释放资源
        SDL_DestroyWindow(window);
        SDL_Quit();
        return -1;
    }

    int showCnt = 0;//显示次数
    int run = 1;//循环退出条件
    SDL_Rect rect;//定义一个SDL举行
    rect.w = 50;
    rect.h = 50;

    while(run){
        //碎甲rect的位置
        rect.x = rand()%600;
        rect.y = rand() % 400;
        // 设置渲染目标为纹理
        SDL_SetRenderTarget(renderer, texture);
        // 设置渲染绘制颜色
        SDL_SetRenderDrawColor(renderer, 255, 0, 255, 255);
        // 刷新渲染
        SDL_RenderClear(renderer);
 
        // 设置渲染绘制颜色
        SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
        // 绘制矩形
        SDL_RenderDrawRect(renderer, &rect);
        // 绘制填充矩形
        SDL_RenderFillRect(renderer, &rect);
 
        // 恢复渲染目标为窗口
        SDL_SetRenderTarget(renderer, NULL);
        SDL_RenderCopy(renderer, texture, NULL, NULL);
 
        // 显示纹理
        SDL_RenderPresent(renderer);
        SDL_Delay(300);
 
        if(showCnt++ >= 30)
            run = 0;
    }


    SDL_Delay(5000);//延迟5000毫秒
    SDL_DestroyWindow(window);//销毁窗口
    SDL_Quit();//释放资源
    
    // 引入ffmpeg并打印版本号
    unsigned codecVer = avcodec_version();
    cout << codecVer<<endl;
    cout << "codec版本号:"<<codecVer <<endl;
    return 0;
}

  10.打开mingw64命令行工具,输入./run.sh执行脚本

   11.执行结果会在项目根目录下的bin中输出可执行文件的.exe文件并自动运行,build目录为编译目录

   12.效果图如下

 

 

标签:bin,cmake,ffmpeg,sdl2,dev,opencv,include,DIR
From: https://www.cnblogs.com/tony-yang-flutter/p/17824536.html

相关文章

  • ffmpeg常用的几个命令
    ffmpeg-ss00:08:20-t00:10:02-iVideo_20230406112629898.avi-vcodeccopy-acodeccopyoutput.avi假设您要提取视频的一部分——比如从第10秒到第20秒。您需要做的第一件事是告诉FFmpeg搜索到第10秒,对吗?这是使用FFmpeg命令行中的 -ss 参数实现的,语法为–./......
  • ffmpeg中的时间戳
    参考:https://zhuanlan.zhihu.com/p/4683463961、基本概念ffmpeg中提及时间戳时,一定要明确它所对应的时基(time_base)。为精确描述该其数值,使用以下结构体来描述这一有理数概念。typedefstructAVRational{intnum;///<numeratorintden;///<denominator}AVRation......
  • 使用 VSCode+CMake+Ninja 开发RISC-V MCU
    1.安装软件及工具1.1VSCode安装VisualStudionCode(VSCode),是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全(又称IntelliSense)、代码重构、查看定义功能,并且内置了命令行工具和Git版本控制系统。VSCode官网VSCode官方文档官网......
  • cmake Ninja 集成试用
    核心比较简单就是添加Ninja的依赖工具,然后再构建的时候指定生成器为Ninja使用安装ninja我使用的mac系统 brewinstallninja生成前提是已经有了一个CMakeLists.tx同时还没有初始化 cmake-GNinja..效果 构建......
  • cmake内置变量总结
    一、概述在使用CMake配置CMakeLists.txt的时候,内置变量会极大的方便我们编写。所以在这里罗列出cmake常用的内置变量二、常用内置变量PROJECT_SOURCE_DIR项目根目录PROJECT_BINARY_DIR执行cmake命令的目录CMAKE_CURRENT_SOURCE_......
  • CMake多个CMakeLists.txt共同合作编译一个C++项目
    一、概述在C++项目比较大或者要根据不同的规则生成不同的执行文件或者动态库/静态库的时候。单独的CMakeLists.txt会变的比较复杂,此时可以利用CMakeLists.txt的父子关系分目录分模块的进行编译及输出。就相当于项目模块化编译参考博客:【大丙课堂】二、具体实现......
  • 【ffmpeg】将视频转换为9:16的竖屏,多出的两边黑色填充
      【命令】ffmpeg-i1.mp4-vf"scale=1080:ih*1080/iw,pad=iw:iw*16/9:(ow-iw)/2:(oh-ih)/2"4.mp4【参数说明】scale=1080:ih*1080:将视频的宽度设置为1080,高度等比缩放pad=iw:iw*16/9:将视频的高度扩展,多余部分用黑色填充(ow-iw)/2:(oh-ih)/2:将视频在水平和垂......
  • cmake 进行rpm包构建
    cmake实际上包含了构建,测试,以及打包的能力,以下是一个简单的rpm打包测试(cpack模块)项目结构├──CMakeLists.txt├──README.md├──add.c├──add.h└──main.c代码说明main.c为一个入口(可执行文件)CMakeLists.txt是cmake的定义......
  • Windows10+VSCode+CMake+shell脚本编译C/C++程序
    一、概述想要在Windows10上做C++验证/编译类库,借助VSCode(其实这东西要不要都行,它就是来方便查看代码的)+CMake+shell脚本做程序的编译运行。下面写一个小例子记录一下准备工作:1.编译环境用的是mingw64,使用其再带的g++编译,ps:记得要配置其环境变量2......
  • centos7 安装 ffmpeg踩坑后纪
    从网上看了一篇在LINUX上安装FFMPEG作为流媒体服务器的文章后,不知深浅的照着教程来学,一个坑接一个坑。1、我看的教程原文,写的非常好,;https://www.jianshu.com/p/b1680d3ecd4f2、修路填坑之旅(小白的电脑什么都没有装); 首先,先要安装gcc,再要安装x264,还要装yasm  错误1,......