【配置环境】Visual Studio 配置 OpenCV

2023-11-08

目录

一,环境

二,下载和配置 OpenCV

三,创建一个 Visual Studio 项目

四,配置 Visual Studio 项目

五,编写并编译 OpenCV 程序

六,解决CMake编译OpenCV报的错误

七,本人编译好的库


一,环境

  • Windows 11 家庭中文版
  • Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.5.3
  • CMake – 3.24.1
  • OpenCV – 4.8.0

二,下载和配置 OpenCV

1.在Windows下安装OpenCV,通常有两种选择

  1. 使用预编译的二进制库(推荐): 这是最常见的方法。可以从OpenCV官方网站下载已经编译好的二进制版本,无需自己编译。这些预编译库已经包含了OpenCV的头文件和库文件,可以直接在项目中使用。
    1. 前往 OpenCV Releases 页面 下载最新的版本(选择Windows版)。
    2. 解压下载的文件到指定路径下,会得到一个文件夹,例如opencv/build,内容参考如下。
  2. 从源代码编译OpenCV(高级选项): 如果需要进行高级配置、自定义编译选项或者希望在Windows上编译OpenCV的源代码,可以选择这种方法。但这通常较为复杂,需要更多时间和资源。
    1. 首先,从OpenCV的 GitHub仓库 下载源代码。
    2. 安装CMake,可以从 CMake官网 下载并安装最新的CMake版本,这是一个用于配置和生成编译项目的工具。
    3. 打开CMake GUI,在 “Where is the source code” 中选择OpenCV的源代码目录。在 “Where to build the binaries” 中选择一个用于生成编译结果的目标文件夹,通常建议在源代码目录之外创建一个名为 “build” 的文件夹。
    4. 点击 “Configure” 按钮。CMake将提示选择生成器,选择合适的Visual Studio版本(例如,Visual Studio 2022),选择需要生成的位数(默认为64位)。
    5. CMake编译过程中可能会报一些红色的错误的提示信息,解决办法看最后一节。(可以跳过这些错误
    6. 配置选项:在CMake配置过程中,可以根据需要设置不同的选项,如编译类型、安装路径、开启/关闭模块等。确保根据自己的需求进行配置。(网上搜索
    7. 点击 “Generate” 按钮,这将生成一个Visual Studio项目文件。
    8. 打开生成的Visual Studio项目文件(通常是.sln文件),或者点击CMake界面的“Open Project”。
    9. 在Visual Studio中,选择 “Release” 或 “Debug” 配置(根据需要选择),然后找到 “CMakeTargets > INSTALL” 文件,右击该文件选择 “生成” 选项。这将编译OpenCV。

    10. 编译完成后,可以在生成的目标文件夹中找到编译好的OpenCV库文件(通常在 build/install 文件夹下)。
    11. 按照上面方式可以自行构建Release/Debug,64/32位的库。

2.配置 OpenCV 环境变量

  1. 使用键盘快捷键 Win + R 打开运行对话框。在运行对话框中,输入 sysdm.cpl,然后按 Enter 键。这将直接打开系统属性窗口的 “高级” 选项卡,从那里访问环境变量配置。
  2. 添加OpenCV的 bin 文件夹路径,以便系统可以找到OpenCV的DLL文件。例如:D:\Program Files\OpenCV\build\x64\vc16\bin(请根据你的实际路径进行替换)。
  3. 添加OpenCV的 lib 文件夹路径,以便编译器和连接器可以找到OpenCV的库文件。例如:D:\Program Files\OpenCV\build\x64\vc16\lib(请根据你的实际路径进行替换)。
  4. 确保点击了 "确定" 按钮,然后关闭所有窗口。
  5. 打开命令提示符,输入 opencv_version 命令,检查OpenCV是否配置成功。如果配置成功,会输出OpenCV的版本号,表明OpenCV库可在命令行中正常运行。

三,创建一个 Visual Studio 项目

使用Visual Studio创建一个新的C++项目,或者打开一个现有的项目。

四,配置 Visual Studio 项目

1.跟随项目进行配置(推荐)

  1. 打开项目属性,选择 “配置属性 > VC++ 目录”,然后将 “包含目录” 配置为包含OpenCV的include文件夹(opencv\build\include),将 “库目录” 配置为包含OpenCV的lib文件夹(opencv\build\x64\vc16\lib)。
  2. 在 “配置属性 > 链接器 > 输入” 下,将 “附加依赖项” 添加要使用的 OpenCV 库文件(例如 opencv_world480d.lib)。

2.全局配置(不推荐)

  1. 点击工具栏的 “视图” 视图项。展开后点击 “其它窗口 > 属性管理器”。
  2. 然后会得到四种不同的模式,在每种模式目录下会默认有几个系统文件,这里对 “xxx.64.user” 系统文件按照前面提到的方式配置当前项目以使用这些编译库,在这些系统文件中进行的属性配置是全局配置。

  3. 也可以新添一个属性文件,然后也按照前面提到的方式配置当前项目以使用这些编译库,该属性文件是保存在当前项目目录下的(这种配置是跟随项目的,可以对四种模式都新添一个属性文件)。

五,编写并编译 OpenCV 程序

以下是一些基本图像处理程序

1.加载和显示图像:创建一个程序,能够加载图像文件并将其显示在窗口中。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 显示图像
    cv::imshow("My Image", image);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

2.调整图像大小:编写代码,可以加载图像并调整其大小。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 调整图像大小
    cv::Size newSize(800, 600);
    cv::Mat resizedImage;
    cv::resize(image, resizedImage, newSize);

    // 显示调整后的图像
    cv::imshow("Resized Image", resizedImage);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

3.应用滤波器:学习如何应用常见的图像滤波器,例如高斯滤波器。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 应用高斯滤波
    cv::Mat blurredImage;
    cv::GaussianBlur(image, blurredImage, cv::Size(5, 5), 0);

    // 显示模糊图像
    cv::imshow("Blurred Image", blurredImage);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

4.检测边缘:创建一个程序,用于检测图像中的边缘。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 检测边缘
    cv::Mat edges;
    cv::Canny(image, edges, 100, 200);

    // 显示边缘图像
    cv::imshow("Edge Image", edges);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

5.图像转换:练习图像颜色空间的转换,如将彩色图像转换为灰度图像,并将图像从RGB颜色空间转换为HSV颜色空间。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 转换为灰度图像
    cv::Mat grayImage;
    cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);

    // 显示灰度图像
    cv::imshow("Gray Image", grayImage);
    cv::waitKey(0);
    cv::destroyAllWindows();

    // 转换为HSV颜色空间
    cv::Mat hsvImage;
    cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);

    // 分离通道
    std::vector<cv::Mat> channels;
    cv::split(hsvImage, channels);

    // 显示H、S、V通道
    cv::imshow("Hue Channel", channels[0]); // H通道
    cv::imshow("Saturation Channel", channels[1]); // S通道
    cv::imshow("Value Channel", channels[2]); // V通道
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

6.要深入理解OpenCV,官网也提供了丰富的示例代码,如下。

六,解决CMake编译OpenCV报的错误

1.定位问题

  • 以下错误表示检测到了Python解释器的版本与期望的版本不符,但这个错误可以忽略,不用管
  • 但后面会出现很多如下这种错误,就是不能从指定的链接中下载需要的文件资源,详细情况可以看 build/CMakeDownloadLog.txt 文件。
  • CMakeDownloadLog.txt 文件用途:
    • CMakeDownloadLog.txt 文件是由CMake工具生成的日志文件,主要用于记录CMake在下载依赖项和外部资源时的详细信息。
    • CMakeDownloadLog.txt 文件对于排查和调试依赖项下载问题非常有用。当在使用CMake配置或构建项目时,如果下载依赖项失败或遇到与外部资源相关的问题,可以查看这个文件以获取更多信息,以便进一步解决问题。
  • 打开 CMakeDownloadLog.txt 文件后,会显示如下信息,其中的每一段都是我们要解决的错误:

2.分析问题

  • 先分析这些错误信息是什么意思,然后我们就很容易的去解决问题了,摘取其中一段显示如下(其它都是类似的问题)
  • 其中红框的内容解释如下:
    • #do_copy:这是一个命令,表示从指定的URL下载名为 "ffmpeg_version.cmake" 的文件,并将其复制到本地目录 "D:/opencv/build/3rdparty/ffmpeg"。并且该文件的MD5哈希值文设置为 "8862c87496e2e8c375965e1277dee1c7"。
    • #missing:这是一条信息,表示在指定的本地目录中没有找到名为 "ffmpeg_version.cmake" 的文件。
    • #check_md5:这是一条信息,表示检查名为 "ffmpeg_version.cmake" 文件的MD5哈希值,以验证文件完整性。
    • #mismatch_md5:这是一条信息,表示本地文件的MD5哈希值与预期值 "d41d8cd98f00b204e9800998ecf8427e" 不匹配,说明文件可能已损坏或缺失。
    • #delete:这是一条命令,表示删除本地缓存目录中的文件。
    • #cmake_download:这是一条命令,表示尝试从指定的URL重新下载文件。
    • #try 1:这是一条信息,表示这是第一次尝试下载文件。
    • 总的来说:do_copy 尝试从指定的URL下载名为 "ffmpeg_version.cmake" 的文件,并保存到本地目录 "D:/opencv/build/3rdparty/ffmpeg"。首先,它检查本地目录中是否已经存在文件 "ffmpeg_version.cmake",但没有找到该文件(missing)。然后,它尝试根据文件的MD5哈希值检查本地缓存目录中是否有与下载文件匹配的文件,但发现MD5哈希值不匹配(mismatch_md5)。接下来,它尝试从指定的URL下载文件,并在第一次尝试时遇到了网络问题。
  • 具体的错误信息:
    • # timeout on name lookup is not supported这个错误消息表示在进行DNS名称解析时发生了超时错误。CMake试图解析主机名 "raw.githubusercontent.com",但因为解析超时,所以无法连接到该主机。
    • # getaddrinfo(3) failed for raw.githubusercontent.com:443这个错误消息表明获取主机地址信息失败,其中 "raw.githubusercontent.com:443" 是要解析的主机名和端口。
    • # Could not resolve host: raw.githubusercontent.com这个错误消息指出无法解析主机名 "raw.githubusercontent.com"。
    • # Closing connection 0这是一条信息,表示关闭了与主机的连接。
    • 总结:这些错误的主要原因是CMake无法通过DNS解析找到主机名 "raw.githubusercontent.com",因此无法连接到GitHub服务器以下载所需的文件 "ffmpeg_version.cmake"。

3.解决问题

  • 确定了问题原因是无法下载 ffmpeg_version.cmake 文件,浏览器输入指定的URL后,显示如下信息:
  • 接下来就是要下载 ffmpeg_version.cmake 文件,然后覆盖D:/opencv/source/.cache/ffmpeg/8862c87496e2e8c375965e1277dee1c7-ffmpeg_version.cmake 文件,再进行编译就行了。

七,本人编译好的库

百度网盘链接:VS2022编译的OpenCV库,四种模式下都可以使用(Release32,Release64,Debug32,Debug64)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【配置环境】Visual Studio 配置 OpenCV 的相关文章

  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • OpenCV的拼接模块可以拼接平行运动相机拍摄的图像吗?

    我想知道是否缝合 http docs opencv org modules stitching doc stitching html http docs opencv org modules stitching doc stitching
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • opencv形态扩张滤波器作为最大滤波器

    就像中值滤波器的定义一样 我可以将 最大滤波器 定义为局部窗口 例如dst x y max 3x3 局部窗口像素 但我在opencv中找不到这样的过滤器 最接近的是 dilate 函数 然后我使用 dilate 函数的默认配置 但结果不正确
  • 使用 OpenCV 改进特征点匹配

    我想匹配立体图像中的特征点 我已经用不同的算法找到并提取了特征点 现在我需要一个良好的匹配 在本例中 我使用 FAST 算法进行检测和提取 BruteForceMatcher用于匹配特征点 匹配代码 vector lt vector
  • 如何确定与视频中物体的距离?

    我有一个从行驶中的车辆前面录制的视频文件 我将使用 OpenCV 进行对象检测和识别 但我停留在一方面 如何确定距已识别物体的距离 我可以知道我当前的速度和现实世界的 GPS 位置 但仅此而已 我无法对我正在跟踪的对象做出任何假设 我计划用
  • 从包含带边框的表格的图像中提取表格结构

    我正在尝试提取下表中的单元格位置 应用自适应阈值处理后 我能够获得细胞位置周围的轮廓 并且 HoughLines 获得垂直和水平结构元素 这是我的代码 img cv2 imread os path join img path file im
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • iOS 上的 OpenCV - VideoCapture 属性始终返回 1

    我一直在尝试构建一个简单的 OpenCV iOS 应用程序 该应用程序从捆绑包中加载视频并查询其帧数 持续时间等 然后它将尝试从中获取各个帧 不幸的是 当我使用VideoCapture类中 所有属性返回值 1 然后我尝试导航到frame 1
  • 在 Python 中将 OpenCV 帧流式传输为 HTML

    我正在尝试从 opencv Pyt hon 中的 URL 读取视频 然后逐帧处理它 然后将其发送到 HTML 页面 But I am only getting the first frame after that the program g
  • cv2.drawContours() - 取消填充字符内的圆圈(Python,OpenCV)

    根据 Silencer的建议 我使用了他发布的代码here https stackoverflow com questions 48244328 copy shape to blank canvas opencv python 482465
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 将 4 通道图像转换为 3 通道图像

    我正在使用 OpenCV 2 4 6 我正在尝试将 4 通道 RGB IplImage 转换为 4 通道 HSV 图像 下面是我的代码 给出错误 OpenCV 错误 未知函数断言失败 我认为 cvCvtColor 支持 3 通道图像 有没有
  • 是否可以在 PyScript 中使用 OpenCV 模块?

    我想使用 opencv 模块 但无法导入 OpenCV 那么我该如何解决这个问题呢 顺便说一句 Pyodide 支持 OpenCV 示例代码 https i stack imgur com ahwex jpg 尚不支持 OpenCV 此时O
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • Python:Urllib2 和 OpenCV

    我有一个程序 可以将图像保存在本地目录中 然后从该目录中读取图像 但我不想保存图像 我想直接从url读取它 这是我的代码 import cv2 cv as cv import urllib2 url http cache2 allposte

随机推荐

  • Fully Attentional Network for Semantic Segmentation

    背景 非局部注意力使用一个简单的相似度矩阵 因此会造成attention miss 为了解决这个问题 提出了fully attentional network 同时进行位置和通道编码 本文主要解决在通道非局部中的位置问题 attention
  • scrollview嵌套listview产生的滑动冲突(recyclerview)

    Android滑动冲突主要有两种方法 1 外部拦截法 public class ListScrollView extends ScrollView private ListView listView public ListScrollVie
  • adb命令——基础系统类命令 ——adb shell input命令01

    adb做为android的调试桥 在做app自动化中有着巨大的用处 可以帮助我们解决问题 今天主要认识adb shell input adb shell input 我们首先通过cmd输入adb shell input有哪些内容 adb s
  • The specified key does not exist.

    问题截图如下 解决办法 我这边的问题就是 拼接的地址跟实际上访问的地址不一样 首先就是建议你先去在oss对象储存那边查看一个文件的访问地址 对比你拼接的不同之处 这里可能有人会出现自己拼接的地址 在程序中写下载刚才上传的文件能够拿到 这是因
  • TVS相关参数与选型

    一 介绍 TVS Transient Voltage Suppressor 二极管 又称为瞬态抑制二极管 是普遍使用的一种新型高效电路保护器件 它具有极快的响应时间 亚纳秒级 和相当高的浪涌吸收能力 当它的两端经受瞬间的高能量冲击时 TVS
  • 过山车

    http acm hdu edu cn showproblem php pid 2063 Problem Description RPG girls今天和大家一起去游乐场玩 终于可以坐上梦寐以求的过山车了 可是 过山车的每一排只有两个座位
  • Blender插件:Boxcutter v7.1.7_4_Claymore 超强硬表面建模布尔

    Blender插件 Boxcutter v7 1 7 4 Claymore 超强硬表面建模布尔 Boxcutter是一个Blender 3d插件 用于利用屏幕绘图和热键进行概念设计 它已被世界各地的制片厂和公司使用 并已用于电影 AAA游戏
  • vue中window.addEventListener监听scroll事件

    今天想在vue的项目里面用下拉加载 然后就直接写了 mounted window addEventListener scroll this scrollHander methods scrollHander 但是我发现我切换路由以后依旧其他
  • Qt源码分析之信号和槽机制

    Qt的信号和槽机制是Qt的一大特点 实际上这是和MFC中的消息映射机制相似的东西 要完成的事情也差不多 就是发送一个消息然后让其它窗口响应 当然 这里的消息是广义的说法 简单点说就是如何在一个类的一个函数中触发另一个类的另一个函数调用 而且
  • Linux下安装mysql完整教程

    https blog csdn net lizy928 article details 82531749
  • 汽车自动驾驶现状及挑战

    来源 ATC汽车技术会议 自动驾驶现况 自动驾驶技术的发展可以追溯到20世纪60年代 目前总共有六个阶段 从L0级到L5级阶段 L0 无自动化 没有任何自动驾驶功能或技术 L1 手动驾驶辅助 驾驶员仍然对行车安全负责 不过可以授权部分控制权
  • django报错:django.db.utils.ProgrammingError: (1146, “Table ‘xxx‘ doesn‘t exist“)

    问题描述 交接django项目后 启动项目时报错 django db utils ProgrammingError 1146 Table app perf django apscheduler djangojob doesn t exist
  • 那些年我们一起优化的SQL

    一 背景 随着业务不断迭代 系统中出现了较多的SQL慢查 慢查虽不致命 但会让商家感知到系统较慢 影响使用体验 在进行慢查优化过程中 我们积累了一些经验 本文将基于我们的实战经历 讲解工作中比较常见的慢查原因 以及如何去优化 本文讲解基于M
  • Python 爬虫之GRequests异步模块

    Python 爬虫之GRequests异步模块 十分想念顺店杂可 运行环境 系统 win10 Python版本 Python 3 6 6 GRequests是异步非阻塞的异步请求第三方包 使用了协程gevent GRequests封装了ge
  • PC端微信打不开小程序解决

    PC端微信点击小程序之后没有啥反应 可以使用下面的方法解决 右键桌面的微信快捷方式 属性 兼容性 勾选上以兼容模式运行这个程序即可
  • 141.判断链表是否有环操作

    单链表与环的情况 1 判断链表是否有环 对于这个问题我们可以采用 快慢指针 的方法 就是有两个指针fast和slow 开始的时候两个指针都指向链表头head 然后在每一步操作中slow向 前走一步即 slow slow gt next 而f
  • 【IDEA】IDEA 接口方法不能跳转到实体类实现方法的问题

    1 概述 在做 Flink Flink 1 13 编译 的时候 最后执行命令 flink 1 13 mvn clean install Dmaven test skip true Dhadoop version 2 8 3
  • 【数据架构系列-02】从《数据中台能力成熟度模型》的发布,聊聊火了的中台

    热点之所以会 热起来 是由于万众瞩目的那份炽烈 也是因为无数双 手 的奋力炒作 所以 要穿过那 缭绕烟雾 看到本质 便需要冷静的头脑 2023年1月4日 信通院发布了 数据中台能力成熟度模型 框架 不由让我浮想联翩 之后是不是还会出现业务中
  • vetur mode_modules Cannot find name template 红色波浪不显示

    解决方法 打开文件 首选项 设置中搜索Vetur 拉到最底部 不勾选勾选Script即可 勾选前 取消后
  • 【配置环境】Visual Studio 配置 OpenCV

    目录 一 环境 二 下载和配置 OpenCV 三 创建一个 Visual Studio 项目 四 配置 Visual Studio 项目 五 编写并编译 OpenCV 程序 六 解决CMake编译OpenCV报的错误 七 本人编译好的库 一