Visual Studio 2022新建 cmake 工程测试 opencv helloworld

news2024/9/20 21:17:23

1. 参考博客:

        1.1. https://blog.csdn.net/yangSHU21/article/details/130237669( 利用OpenCV把一幅彩色图像转换成灰度图 )( vs2022_cmake_test.cpp 中的代码用的此博客的,就改了下图片文件路径而已 )

2. 检查 Visual Studio 2022是否支持 cmake:

        打开 Visual Studio installer:

已安装--》修改:

 工作负荷--》使用C++的桌面开发--》可选--》如果 "用于 windows的 C++ cmake工具" 勾选了,即表示你的 Visual Studio 2022 支持 cmake:

3. 操作步骤:

        打开 Visual Studio 2022 --》创建新项目--》搜索 cmake--》选择 "cmake 项目( 生成不依赖于 .sln 或 .vcxproj 文件的新式跨平台 C++ 应用。 )"--》点击下一步--》 设置项目名称、位置--》点击创建,默认生成的 vs2022_cmake_test_02.cpp 文件内容如下:

#include "vs2022_cmake_test_02.h"
using namespace std;

int main()
{
	cout << "Hello CMake." << endl;
	return 0;
}

默认生成的 CMakeLists.txt内容如下:        

cmake_minimum_required (VERSION 3.8)

# 如果支持,请为 MSVC 编译器启用热重载。
if (POLICY CMP0141)
  cmake_policy(SET CMP0141 NEW)
  set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>")
endif()

project ("vs2022_cmake_test_02")

# 将源代码添加到此项目的可执行文件。
add_executable (vs2022_cmake_test_02 "vs2022_cmake_test_02.cpp" "vs2022_cmake_test_02.h")

if (CMAKE_VERSION VERSION_GREATER 3.12)
  set_property(TARGET vs2022_cmake_test_02 PROPERTY CXX_STANDARD 20)
endif()

将 vs2022_cmake_test.cpp 的内容修改为如下所示:

#include "vs2022_cmake_test_02.h"
#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;

void opencv_test();
void ConvertRGB2GRAY(const Mat& image, Mat& imageGray);

void opencv_test() {
	Mat src = imread("D:/素材/图片/壁纸/0001.jpg");
	Mat src0 = imread("D:/素材/图片/壁纸/0001.jpg", 0);
	Mat grayImage;
	Mat cvt_gray_image;

	//读入的彩色图
	namedWindow("origin_image", WINDOW_NORMAL);
	imshow("origin_image", src);

	//opencv使用imread函数读入彩色图,设置第二个参数为0得到的灰度图
	namedWindow("opencv_image", WINDOW_NORMAL);
	imshow("opencv_image", src0);

	//使用公式GRAY=0.299*R+0.587*G+0.114*B
	ConvertRGB2GRAY(src, grayImage);
	namedWindow("my_gray_image", WINDOW_NORMAL);
	imshow("my_gray_image", grayImage);

	//先读入彩色图,然后使用cvtColor函数进行灰度转化
	cvtColor(src, cvt_gray_image, COLOR_BGR2GRAY);
	namedWindow("cvt_gray_image", WINDOW_NORMAL);
	imshow("cvt_gray_image", cvt_gray_image);
	waitKey(0);
}

void ConvertRGB2GRAY(const Mat& image, Mat& imageGray)
{
	if (!image.data || image.channels() != 3)
	{
		return;
	}
	//创建一张单通道的灰度图像
	imageGray = Mat::zeros(image.size(), CV_8UC1);
	//取出存储图像像素的数组的指针
	uchar* pointImage = image.data;
	uchar* pointImageGray = imageGray.data;
	//取出图像每行所占的字节数
	size_t stepImage = image.step;
	size_t stepImageGray = imageGray.step;


	for (int i = 0; i < imageGray.rows; i++)
	{
		for (int j = 0; j < imageGray.cols; j++)
		{
			//opencv的通道顺序是BGR,而不是我们常说的RGB顺序
			pointImageGray[i * stepImageGray + j] =
				(uchar)(0.114 * pointImage[i * stepImage + 3 * j] +
					0.587 * pointImage[i * stepImage + 3 * j + 1] +
					0.299 * pointImage[i * stepImage + 3 * j + 2]);
		}
	}
}



int main()
{
	cout << "Hello CMake." << endl;
	opencv_test();
	return 0;
}

此时 vs2022 报错 "找不到opencv 的头文件":

 找到 opencv2 的位置如下所示:

可以直接将 "D:\install\opencv\opencv\build\include" 加入进来,即在 CMakeLists.txt 中加入 如下指令:

include_directories( "D:/install/opencv/opencv/build/include" ) 

但是这样不太优雅,优雅的做法是加入如下指令:

 find_package(OpenCV REQUIRED) 

其作用是查找 OpenCV 包,找到以后就可以直接使用内置变量 OpenCV_INCLUDE_DIRS 和 OpenCV_LIBS 了( 分别表示 opencv 的 头文件的目录位置和 链接库的目录位置 ),但是 cmake 是从哪里去找 opencv 呢?可能它内置的有一些策略吧,不放心的话或者电脑装了多个版本的 opencv,其实可以手动指定查找位置,即使用如下指令:

set(OpenCV_DIR "D:/install/opencv/opencv/build")

这里指定 "D:/install/opencv/opencv/build" 的依据是什么呢?到底是 opencv 的根目录还是头文件目录还是链接库目录呢?其实应该写 opencv 编译目录中 

OpenCVConfig.cmake

文件所在的目录,例如我电脑中 OpenCVConfig.cmake  所在位置如下所示:

所以我指定的是  D:/install/opencv/opencv/build( ps:windows中 CMakeLists.txt 中的路径最好写正斜线,不能写反斜线!!!不知道双反斜线可不可以?没试过 )

修改后的最终完整的 CMakeLists.txt 如下所示:

cmake_minimum_required (VERSION 3.8)

# 如果支持,请为 MSVC 编译器启用热重载。
if (POLICY CMP0141)
  cmake_policy(SET CMP0141 NEW)
  set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>")
endif()

project ("vs2022_cmake_test_02")

set(OpenCV_DIR "D:/install/opencv/opencv/build")
# 查找OpenCV包
find_package(OpenCV REQUIRED)

# include_directories( "D:/install/opencv/opencv/build/include" )
# set(CMAKE_LIBRARY_PATH "D:/install/opencv/opencv/build/x64/vc16/bin"  "D:/install/opencv/opencv/build/x64/vc16/lib" )

# 如果OpenCV被找到,包含其头文件目录和库
message( "--------------------------------------------------" )
message( "--------------------------------------------------" )
message( "--------------------------------------------------" )
message( "OpenCV_INCLUDE_DIRS = ${OpenCV_INCLUDE_DIRS}"  )
message( "OpenCV_LIBS = ${OpenCV_LIBS}" )
message( "OpenCV_FOUND = ${OpenCV_FOUND}" )

if(OpenCV_FOUND)
  message( "OpenCV founded" )
  include_directories(${OpenCV_INCLUDE_DIRS})
endif()


# 将源代码添加到此项目的可执行文件。
add_executable (vs2022_cmake_test_02 "vs2022_cmake_test_02.cpp" "vs2022_cmake_test_02.h")

if(OpenCV_FOUND)
  message( "OpenCV founded" )
  target_link_libraries(vs2022_cmake_test_02 ${OpenCV_LIBS})
endif()

message( "------------------------------------------------" )
message( "-----------------------------------------------" )
message( "--------------------------------------------------" )

if (CMAKE_VERSION VERSION_GREATER 3.12)
  set_property(TARGET vs2022_cmake_test_02 PROPERTY CXX_STANDARD 20)
endif()

这时候编译就成功了,部分输出信息如下:

1> 工作目录: D:/code/c_code/cpp_study_demo/vs2022/vs2022_cmake_test_02/out/build/x64-debug
1> [CMake] -- OpenCV ARCH: x64
1> [CMake] -- OpenCV RUNTIME: vc16
1> [CMake] -- OpenCV STATIC: OFF
1> [CMake] -- Found OpenCV 4.10.0 in D:/install/opencv/opencv/build/x64/vc16/lib
1> [CMake] -- You might need to add D:\install\opencv\opencv\build\x64\vc16\bin to your PATH to be able to run your applications.
1> [CMake] --------------------------------------------------
1> [CMake] --------------------------------------------------
1> [CMake] --------------------------------------------------
1> [CMake] OpenCV_INCLUDE_DIRS = D:/install/opencv/opencv/build/include
1> [CMake] OpenCV_LIBS = opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_world
1> [CMake] OpenCV_FOUND = 1
1> [CMake] OpenCV founded
1> [CMake] OpenCV founded
1> [CMake] ------------------------------------------------
1> [CMake] -----------------------------------------------
1> [CMake] --------------------------------------------------
1> [CMake] -- Configuring done (0.0s)
1> [CMake] -- Generating done (0.0s)
1> [CMake] -- Build files have been written to: D:/code/c_code/cpp_study_demo/vs2022/vs2022_cmake_test_02/out/build/x64-debug
1> 已提取 CMake 变量。
1> 已提取源文件和标头。
1> 已提取代码模型。
1> 已提取工具链配置。
1> 已提取包含路径。
1> CMake 生成完毕。

可以看到 :

OpenCV_INCLUDE_DIRS = D:/install/opencv/opencv/build/include
OpenCV_LIBS = opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_world

格式化一下:

OpenCV_INCLUDE_DIRS = D:/install/opencv/opencv/build/include
OpenCV_LIBS = opencv_calib3d;
              opencv_core;
              opencv_dnn;
              opencv_features2d;
              opencv_flann;
              opencv_gapi;
              opencv_highgui;
              opencv_imgcodecs;
              opencv_imgproc;
              opencv_ml;
              opencv_objdetect;
              opencv_photo;
              opencv_stitching;
              opencv_video;
              opencv_videoio;
              opencv_world

 

这时候运行 vs2022_cmake_test_02.exe报错:

使用 Everything 搜索下 opencv_world4100.dll:

应该把 D:\install\opencv\opencv\build\x64\vc16\bin 加入环境变量,其实刚才 cmake 的输入信息中已经建议这样做了:

1> [CMake] -- Found OpenCV 4.10.0 in D:/install/opencv/opencv/build/x64/vc16/lib
1> [CMake] -- You might need to add D:\install\opencv\opencv\build\x64\vc16\bin to your PATH to be able to run your applications.
1> [CMake] --------------------------------------------------
1> [CMake] --------------------------------------------

加入环境变量:

 这时候就运行成功了:

 记得打开新的 cmd 测试,如果是在 vs2022中测试也需要关闭工程重新打开进行测试。

4. CMakeLists.txt 中直接使用的变量 OpenCV_INCLUDE_DIRS、OpenCV_LIBS、OpenCV_FOUND 是在哪里定义的?

打开 D:\install\opencv\opencv\build 下面的 OpenCVConfig.cmake,找到如下内容:

#    This file will define the following variables:
#      - OpenCV_LIBS                     : The list of libraries to link against.
#      - OpenCV_INCLUDE_DIRS             : The OpenCV include directories.
#      - OpenCV_COMPUTE_CAPABILITIES     : The version of compute capability
#      - OpenCV_VERSION                  : The version of this OpenCV build: "4.10.0"
#      - OpenCV_VERSION_MAJOR            : Major version part of OpenCV_VERSION: "4"
#      - OpenCV_VERSION_MINOR            : Minor version part of OpenCV_VERSION: "10"
#      - OpenCV_VERSION_PATCH            : Patch version part of OpenCV_VERSION: "0"
#      - OpenCV_VERSION_STATUS           : Development status of this build: ""

说此文件定义了这几个变量,但是这只是注释,此文件并没有直接有声明比如 set( OpenCV_INCLUDE_DIRS ... )  的地方,可能是 该文件引用的其他文件声明了,在该文件中找到了如下内容:


function(check_one_config RES)
  set(${RES} "" PARENT_SCOPE)
  if(NOT OpenCV_RUNTIME OR NOT OpenCV_ARCH)
    return()
  endif()
  set(candidates)
  if(OpenCV_STATIC)
    list(APPEND candidates "${OpenCV_ARCH}/${OpenCV_RUNTIME}/staticlib")
  endif()
  if(OpenCV_CUDA)
    list(APPEND candidates "gpu/${OpenCV_ARCH}/${OpenCV_RUNTIME}/lib")
  endif()
  if(OpenCV_CUDA AND OpenCV_STATIC)
    list(APPEND candidates "gpu/${OpenCV_ARCH}/${OpenCV_RUNTIME}/staticlib")
  endif()
  list(APPEND candidates "${OpenCV_ARCH}/${OpenCV_RUNTIME}/lib")
  foreach(c ${candidates})
    set(p "${OpenCV_CONFIG_PATH}/${c}")
    if(EXISTS "${p}/OpenCVConfig.cmake")
      set(${RES} "${p}" PARENT_SCOPE)
      return()
    endif()
  endforeach()
endfunction()

定义了一个集合变量 candidates,如下一行:

 list(APPEND candidates "${OpenCV_ARCH}/${OpenCV_RUNTIME}/lib")

应该是往集合 candidates 中追加一个路径类型的元素,其中路径中的 OpenCV_ARCH 应该对应我电脑环境的 x64,OpenCV_RUNTIME 应该对应 vc16,果然在 D:\install\opencv\opencv\build\x64\vc16\lib 下面找到了 OpenCVConfig.cmake:

打开此文件,发现了定了定义变量 OpenCV_INCLUDE_DIRS 的地方:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙OpenHarmony Native API【结构体】 头文件

OH_Drawing_BitmapFormat Overview Related Modules: [Drawing] Description: 结构体用于描述位图像素的格式&#xff0c;包括颜色类型和透明度类型 Since: 8 Version: 1.0 Summary Public Attributes Public Attribute NameDescriptioncolorFormatalphaFormat De…

网络基础之(11)优秀学习资料

网络基础之(11)优秀学习资料 Author&#xff1a;Once Day Date: 2024年7月27日 漫漫长路&#xff0c;有人对你笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的博客-CSDN博客。 参考文档&#xff1a; 网络工程初学者的学习方法及成长之路&#xff08;红…

关于虚拟机在桥接模式下连接网络问题的记录

2024年7月28日03:49:19 环境&#xff1a;ubuntu22.04 desktop 虚拟机 问题&#xff1a;使用wget下载nginx安装包时出现问题&#xff0c;443端口持续无连接成功回复。 随后在确定配置ip无问题&#xff0c;检查了其正常访问互联网&#xff0c;随后试图ping niginx网站&#xff…

Removable Access Tool v1.4:你的USB设备安全守护者!

&#x1f680; 大家好&#xff0c;今天电脑天空给大家带来一款超级实用的数据保护软件——Removable Access Tool&#xff08;Ratool&#xff09; v1.4&#xff01; 这不仅仅是一款软件&#xff0c;更是你数据安全的守护神&#xff01; &#x1f512; Ratool简介&#xff1a;这…

Unity横板动作游戏 - 设置瓷砖地图(Tilemap)和叠层

场景绘制和叠层设置 设置地图 选择地图的精灵&#xff0c;在精灵图集的检查器中进行如下修改。 切割地图 点击 Sprite Editor 进行编辑&#xff0c;并按照每个格子16x16进行切割。 设置瓦片调色盘 打开瓦片调色盘并新建一个调色盘&#xff0c;可以在Assets中创建一个Palett…

C语言程序设计之数学函数篇

程序设计之数学函数 问题1_1代码1_1结果1_1 问题1_2代码1_2结果1 _2 问题1_3代码1_3结果1_3 问题1_1 函数 f u n fun fun 的功能是计算&#xff1a; s ln ⁡ ( 1 ) ln ⁡ ( 2 ) ln ⁡ ( 3 ) ⋯ ln ⁡ ( n ) s\sqrt{\ln(1)\ \ \ln(2)\ \ \ln(3)\ \ \cdots \ \ \ln(n)\ } …

基于Python的房产数据分析系统的设计与实现(源码+lw+部署文档+讲解等)

文章目录&#xff1a; 目录 详细视频演示 设计文档详细参考 技术开发的参考技术栈&#xff01; 2.1 Python语言 2.2 Django框架 2.3 MySQL 2.4 Hadoop介绍 2.5 Scrapy介绍 4.2 系统结构设计 4.3 数据库设计 界面设计与功能实现 5.1系统登录注册实现 5.2管理员模块…

计算机毕业设计LSTM+Tensorflow股票分析预测 基金分析预测 股票爬虫 大数据毕业设计 深度学习 机器学习 数据可视化 人工智能

|-- 项目 |-- db.sqlite3 数据库相关 重要 想看数据&#xff0c;可以用navicat打开 |-- requirements.txt 项目依赖库&#xff0c;可以理解为部分技术栈之类的 |-- data 原始数据文件 |-- data 每个股票的模型保存位置 |-- app 主要代码文件夹 | |-- mod…

PyCharm 常用 的插件

Material Theme UI Lite&#xff1a;‌提供多种不同的页面风格&#xff0c;‌为PyCharm界面增添个性化元素。‌Chinese (Simplified) Language Pack&#xff1a;‌为中文用户提供简体中文的界面、‌菜单、‌提示信息&#xff0c;‌提升使用体验。‌Tabnine&#xff1a;‌基于人…

【Django】 js实现动态赋值、显示show隐藏hide效果

文章目录 需要达到的前端效果预览&#xff1a;实现步骤复制bootstrp代码&#xff08;buttons&#xff09;复制bootstrp代码&#xff08;Alert警告框&#xff09;写js测试效果 需要达到的前端效果预览&#xff1a; {% load static %} <!DOCTYPE html> <html lang"…

day06 项目实践:router,axios

vue组件的生命周期钩子 今天几乎没有讲什么新内容&#xff0c;就是一起做项目&#xff0c;只有一个小小的知识点&#xff0c;就是关于vue组件的生命周期钩子&#xff0c;其中最重要的四个函数—— beforeCreate()&#xff1a;组件创建之间执行 created()&#xff1a;组件创建…

05。拿捏ArkTS 第 3 天 --- 对象、联合类型、枚举

1&#xff0c;什么是对象&#xff1f;对象是干什么的&#xff1f; &#xff5e;用来存储不同类型数据的容器 &#xff5e;用来描述物体的特征和行为 //特征就是属性&#xff0c;行为就是方法&#xff08;对象内的函数&#xff09; 2&#xff0c;对象的基本样式是&#xff1f; …

LangChain4j-RAG高级-核心概念

RetrievalAugmentor整体概念 简单总结一下 LangChain4j中对于RetrievalAugmentor这里官方描述的比较模糊, 只在 DefaultRetrievalAugmentor章节给出来了一个灵感来源的文章(LangChain框架中的设计思路)和一个研究报告, 有兴趣可以看一下: Deconstructing RAGhttps://arxiv.o…

Greenplum的诞生与成长过程

Greenplum 成立与早期发展 Greenplum的诞生于早起发展 Greenplum于2003年在美国硅谷成立&#xff0c;在2006年发布了基于PostgreSQL(8.x)的MPP数据库产品&#xff0c;作为与公司同名的MPP数据库&#xff0c;专为分析和管理海量数据集而设计&#xff0c;支持复杂的数据分析和商…

0724,select +tcp 聊天室喵

目录 TCP协议喵 723__01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 001: 002: TIMEWAI OR BUG 721作业&#xff1a; 01&#xff1a;在一对一聊天的基础上&#xff0c;使用select实现一对多的回显服务。&#xff08;回显服务即接收到客户端发送的数…

布尔盲注——多种方式实现及利用burpsuite爆破

目录 1、判断闭合符类型 2、爆数据库长度 3、查询库名 手动注入 burpsuite爆破 方法一&#xff1a;用ASCII码值转化爆破 方法二&#xff1a;left方法直接爆破字母 方法三&#xff1a;if方法爆破注入&#xff08;最简单&#xff09; 4、爆破表名 5、爆破具体值 当我们改变前端…

javaEE(1)

一. Web开发概述 Web开发:指的是从网页中向后端程序发送请求,与后端程序进行交互 Web服务器:是一种软件,向浏览器等Web客户端提供文档等数据,实现数据共享,它是一个容器,是一个连接用户和程序之间的中间键 二. Web开发环境搭建 我们要实现前后端交互,首先需要中间键Web服务…

pinia安装及简介

pinia简介 基本特点 轻量级&#xff1a;Pinia相比于传统的Vuex&#xff0c;体积更小&#xff0c;性能更好&#xff0c;只有大约1KB左右。 简化API&#xff1a;Pinia简化了状态管理库的使用方法&#xff0c;抛弃了Vuex中的mutations&#xff0c;只保留了state、getters和actions…

论文阅读:(DETR)End-to-End Object Detection with Transformers

论文阅读&#xff1a;&#xff08;DETR&#xff09;End-to-End Object Detection with Transformers 参考解读&#xff1a; 论文翻译&#xff1a;End-to-End Object Detection with Transformers&#xff08;DETR&#xff09;[已完结] - 怪盗kid的文章 - 知乎 指示函数&…

传输层(port)UDP/TCP——解决怎么发,发多少,出错了怎么办

**传输层&#xff1a;**负责数据能够从发送端传输接收端. 传输层所封装的报头里一定有&#xff1a;源端口号和目的端口号的。 **端口号&#xff1a;**可以标识一台主机中的唯一一个进程&#xff08;运用程序&#xff09;&#xff0c;这样当数据传输到传输层的时候就可以通过端…