OpenCV简介及安装
前言
因为最近想做图像处理、人脸检测/识别之类的相关开发,所以就开始补OpenCV的相关知识,便开个专栏用于记录学习历程和在学习过程中遇到的一些值得注意的重点和坑。
学习过程基本上也是面向官方文档和Google。
简介
OpenCV(开源的计算机视觉库)是基于BSD协议,因此它可免费用于学术和商业用途。
其提供C++,C,Python和Java接口,支持Windows,Linux,Mac OS,iOS和Android。
OpenCV致力于高效运算和即时应用开发。因其是用优化的C/C++编写的,故其可以充分利用多核处理优势。
并且还启用了OpenSL,它可以利用底层异构计算平台的硬件加速。
广泛运用在世界各地,OpenCV拥有超过4.7万人的用户社区和超过1400万的下载次数。
从互动艺术、矿山检查、网络地图到先进的机器人技术都有OpenCV的身影。
它包含了数百个计算机视觉算法。它有一个模块化的结构,囊括了几个共享的或静态的库,其中包括:
-
Core functionality(核心功能):一个简洁基本且模块化的数据结构,包含了多维数组(矩阵)和用于其他模块的基本功能。
-
Image processing(图像处理):包括线性和非线性的图像滤波、几何图像转换(缩放、仿射和透视调整)、颜色模式转换、直方图等等。
-
Video(视频):一个视频分析模块,其包含了运动估计、背景消除和目标跟踪算法。
-
Calib3d:提供基本的多视图几何算法、平面和立体影像校正、物体定位、立体通信算法和三维重建。
-
Features2d:显著特征探测器、描述符和描述符匹配器。
-
Objectect:检测对象和预定义的类的实例(例如:脸部、眼睛、杯子、人、车等等)。
-
Highgui(图形界面):提供一个简单易用的UI。
-
Video I/O:提供一个简单易用的视频捕获和编码解码界面。
-
GPU:来自于不同的OpenCV模块的GPU加速算法。
-
......一些其他的辅助模块,例如FLANN(神经网络)和Google测试封装、Python绑定等等。
下面来讲一下OpenCV的下载和安装(C++和Python3 API)。
C++
先从官网上下载好文件包:Releases - OpenCV library
https://link.zhihu.com/?target=https%3A//opencv.org/releases.html
建议选择最新的3.3.1 Win Pack。

下载好后,双击运行exe程序解压,选择一个解压后的目录。
(其会自动生成一个opencv目录,不需要单独再创一个opencv目录。另,不建议将其解压到C盘根目录下的Program Files或Program File (x86)目录下,可能会因系统权限导致各种问题)

解压完毕后,将其写入系统的环境变量中,向Path中添加一条:"解压后opencv所在的文件夹目录\opencv\build\x64\vc14\bin",
例如我将其解压在C:\Leon下,则添加:C:\Leon\opencv\build\x64\vc14\bin。

这样OpenCV3.3.1就算安装好了,接下来就在自己IDE中配置一下就行。
例如我C++开发环境是Visual Studio 2017,相应的项目创建配置流程如下:
1. 打开Visual Studio,新建一个项目(快捷键Ctrl+Shift+N),项目名自取,选择好创建目录。

第一步图
2. 新建一个C++文件(快捷键Ctrl+Shift+A)。

第二步图
3. 将菜单栏下的Debug后的x86改为x64。

第三步图
4. 单击右侧窗口的Property Manager(属性管理),或者点击菜单栏中的View(视图)->Other Windows(其他窗口)->Property Manager(属性管理)。

第四步图
5. 右键属性管理窗口中的Debug | x64,选择Property(属性),编辑包含目录。

第五步图
6. 添加三个目录路径并确定。(注意路径是你opencv安装的路径)

第六步图
7. 同理,添加库目录,如图所示。

第七步图1

第七步图2
8. 添加附加依赖项。
链接器->输入->附加依赖项。
将opencv_world331d.lib键盘敲入(注意opencv版本,3.3.1是331,其他版本自行脑补)。

第八步图1

第八步图2
9. 确定,应用。库的导入已经完成了。接下来就可以开始OpenCV相关开发了。
10. 先将以下代码(功能是显示一张图片)写入项目中的Source.cpp文件,编译链接运行(快捷键Ctrl+F5),看是否能跑起来,跑起来了说明配置成功!
#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat img = imread("C:\\Users\\11537\\Desktop\\新垣结衣.jpg"); //引号内选一张自己计算机内的图片的路径imshow("新垣结衣", img); //打开一个窗口,显示图片waitKey(0); //在键盘敲入字符前程序处于等待状态destroyAllWindows(); //关闭所有窗口return 0;
}
测试效果图如下:

Python 3.x
相对于C++,Python的Opencv库导入就相对简单很多了。
一提及Python安装第三方库,大家第一时间会想到pip,的确pip是Python第三方库安装的利器。
首先我们得先安装另一个第三方库numpy,这是opencv的依赖库,没有它无法进行python-opencv开发。
很简单,保持有网状态命令行下输入pip install numpy,自动下载安装完后搞定。
比较遗憾的是默认的pip源中没有opencv这个库,不能直接pip install opencv,不过这时候我们可以下载其whl文件,下载地址:Python Extension Packages for Windows
https://link.zhihu.com/?target=https%3A//www.lfd.uci.edu/~gohlke/pythonlibs/
在页面中找到OpenCV栏,根据自己计算机中Python解释器版本选择下载文件。

下载好后,通过命令行到whl文件目录下,pip install [下载的whl完整文件名]。例如pip install opencv_python-3.3.1-cp36-cp36m-win_amd64.whl
tip: 可以通过这个方法下载其他whl文件,用法一样,可以在无网状态下直接pip install whl文件导入第三方库
对于PyCharm用了Virtualenv虚拟环境的用户,可以在IDE中打开命令行界面到该项目venv/Scripts目录下./pip install numpy以及whl文件导入虚拟目录site-packages文件夹中。
同样上个测试代码(功能是显示一张图片):
import numpy as np
import cv2def cv2_imread(file_path, flag=1):
"""解决包含中文的路径cv2.imread无法打开的问题的函数"""return cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), flag)if __name__ == "__main__":img = cv2_imread("C:\\Users\\11537\\Desktop\\长泽雅美.jpg") #第一个参数选一张自己计算机内的图片的路径cv2.imshow("Nagasawa Masami", img) #python的cv2.imshow第一个参数(即窗口名)为中文会乱码,至今未找到有效解决方案cv2.waitKey(0) #在键盘敲入字符前程序处于等待状态cv2.destroyAllWindows() #关闭所有窗口
测试效果图如下:

小结
一次OpenCV初体验,个人觉得可能是历史遗留问题(以前的OpenCV是完全由C实现的),OpenCV的OOP特性并不强,跟Python的另一个图像库pillow相比用起来感觉有点怪。
不过不得不说,OpenCV还是挺强大的。至于C++和Python关于OpenCV接口问题,其实实现都大同小异,也没必要纠结于到底用C++好还是Python好,移植重构很容易。
后续打算记录一下OpenCV关于图像和基于矩阵处理的相关笔记。
参考文献
OpenCV: Introduction:
https://link.zhihu.com/?target=https%3A//docs.opencv.org/master/d1/dfb/intro.html
OpenCV学习笔记(一) OpenCV简介及安装 (qq.com)
相关文章:
OpenCV简介及安装
前言 因为最近想做图像处理、人脸检测/识别之类的相关开发,所以就开始补OpenCV的相关知识,便开个专栏用于记录学习历程和在学习过程中遇到的一些值得注意的重点和坑。 学习过程基本上也是面向官方文档和Google。 简介 OpenCV(开源的计算机视觉库)是基于…...
Unity调用dll踩坑记
请用写一段代码,让unity无声无息的崩溃。 你说这怕是有点难哦,谁会这么不幸呢?不幸的是,我幸运的成为了那个不幸的人。 unity里面调用dll的方式是使用 DllImport ,比如有一个 Hello.dll,里面有一个 char* …...
Oracle 数据库基线安全加固操作
目录 账号管理、认证授权 ELK-Oracle-01-01-01 ELK-Oracle-01-01-02 ELK-Oracle-01-01-03 ELK-Oracle-01-01-04 ELK-Oracle-01-01-05 ELK-Oracle-01-01-06 ELK-Oracle-01-01-07 …...
安装最新版WebStorm来开发JavaScript应用程序
安装最新版WebStorm来开发JavaScript应用程序 Install the Latest Version of JetBrains WebStorm to Develop JavaScript Applications By JacksonML 2023-11-25 1. 系统要求 WebStorm是个跨平台集成开发环境(IDE)。按照JetBrains官网对WebStorm软件…...
python opencv 放射变换和图像缩放-实现图像平移旋转缩放
python opencv 放射变换和图像缩放-实现图像平移旋转缩放 我们实现这次实验主要用到cv2.resize和cv2.warpAffine cv2.warpAffine主要是传入一个图像矩阵,一个M矩阵,输出一个dst结果矩阵,计算公式如下: cv2.resize则主要使用fx&…...
安装Anaconda、PyTorch(GPU版)库与PyCharm】
【Python深度学习:安装Anaconda、PyTorch(GPU版)库与PyCharm】https://www.bilibili.com/video/BV1cD4y1H7Tk?vd_source0aeb782d0b9c2e6b0e0cdea3e2121ebadownload.pytorch.org/whl/torchaudio/更改Jupyter Notebook的默认路径,亲…...
关于pytorch以及相关包的安装教程
一.查看自己电脑的配置 首先查看自己电脑的cuda的版本,WinR,敲入cmd打开终端 输入nvidia-smi,查看自己电脑的显卡等配置 这里要说明一下关于这个CUDA,它具有向后兼容性,这意味着支持较低版本的 CUDA 的应用程序通常也可以在较高版本的 CUD…...
AnalyticDB for PostgreSQL 实时数据仓库上手指南
AnalyticDB for PostgreSQL 实时数据仓库上手指南 2019-04-016601 版权 本文涉及的产品 云原生数据仓库 ADB PostgreSQL,4核16G 50GB 1个月 推荐场景: 构建的企业专属Chatbot 立即试用 简介: AnalyticDB for PostgreSQL 提供企业级数…...
【数据结构】堆(C语言)
今天我们来学习堆,它也是二叉树的一种(我滴神树!) 目录 堆的介绍:堆的代码实现:堆的结构体创建:堆的初始化:堆的销毁:堆的push:堆的pop:判空 &am…...
使用 Raspberry Pi、Golang 和 HERE XYZ 制作实时地图
到目前为止,您可能已经看过我的一些与 Raspberry Pi 和位置数据相关的教程。我是这些小型物联网 (IoT) 设备的忠实粉丝,并编写了有关使用 Golang 进行 WLAN 定位 和 使用 Node.js 进行 GPS 定位的教程。 我想继续沿着 Golang 路线,做一个关于…...
贪吃蛇(c实现)(真的超级超级简单)
1.代码请看贪吃蛇c实现 王赫辰/c语言 - 码云 - 开源中国 (gitee.com) 2.本项目宗旨: 1.不引入复杂的库函数(其他博主的全是陌生库函数看不懂?看我就对了!◕‿◕) 2.不使用c语法 (都说了c实现,…...
linux 内存回收mglru算法代码注释2
mglru与原lru算法的兼容 旧的lru算法有active与inactive两代lru,可参考linux 内存回收代码注释(未实现多代lru版本)-CSDN博客 新的算法在引入4代lru的同时,还引入了tier的概念。 新旧算法的切换的实现在lru_gen_change_state&a…...
Exchange意外登录日志
最近在审计Exchange邮件系统的时候,发现大量用户半夜登录的日志。而且都是成功的,几乎没有失败的情况。其中Logon Type 8表示用户从网络登录。 Logon type 8: NetworkCleartext. A user logged on to this computer from the network. The user’s pas…...
NX二次开发UF_CURVE_ask_curve_turn_angle 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_turn_angle Defined in: uf_curve.h int UF_CURVE_ask_curve_turn_angle(tag_t curve, double orientation [ 3 ] , double * angle ) overview 概述 Returns …...
UE 进阶篇一:动画系统
导语: 下面的动画部分功能比较全,可以参考这种实现方式,根据自己项目的颗粒度选择部分功能参考,我们商业项目动画部分也是这么实现的。 最后实现的效果如下: 最终效果 目录: ------------------------------------------- 文末有视频教程/工程地址链接 -------------…...
超文本传输协议
超文本传输协议(HypertextTransfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容…...
『heqingchun-Ubuntu系统+x86架构+编译安装ffmpeg+带有nvidia硬件加速』
Ubuntu系统x86架构编译安装ffmpeg带有nvidia硬件加速 一、准备文件 注:可直接下载我上传的CSDN资源,然后直接跳到"一"中的第"3"项"将文件按以下顺序存放"。 ffmpeg源码:音视频开发ffmpeg编译所需资源文件 其…...
UE5 UI教程学习笔记
参考资料:https://item.taobao.com/item.htm?spma21n57.1.0.0.2b4f523cAV5i43&id716635137219&ns1&abbucket15#detail 基础工程:https://download.csdn.net/download/qq_17523181/88559312 1. 介绍 工程素材 2. 创建Widget UE5 UI系统的…...
Leetcode:622. 设计循环队列 题解【具详细】
目录 一、题目: 二、思路详解: 1.循环队列的存储定义 2.循环队列的创建 3.循环队列的判空与判断情况 (1) 循环队列的判空: (2) 循环队列的判满 4.循环队列元素的插入 5.循环队列元素的删除 6.获取队头元素 7.获取队尾元素 8.循环队列释放 三…...
ArkTS基础知识 【习题】
判断题 1.循环渲染ForEach可以从数据源中迭代获取数据,并为每个数组项创建相应的组件。 正确(True) 2. Link变量不能在组件内部进行初始化。 正确(True) 单选题 1.用哪一种装饰器修饰的struct表示该结构体具有组件化能力?(A) A. Component B. Entry C…...
C++新手必看:别再傻傻用typeid判断类型了,这些坑你踩过吗?
C类型判断进阶指南:从typeid陷阱到现代解决方案 刚接触C的类型系统时,很多开发者会本能地想到用typeid来判断变量类型——这看似是个直接了当的选择。但当你真正开始构建复杂系统时,会发现这个看似简单的工具背后隐藏着不少"坑"。记…...
ITK-SNAP医学图像分割:从新手到专家的实战指南
ITK-SNAP医学图像分割:从新手到专家的实战指南 【免费下载链接】itksnap ITK-SNAP medical image segmentation tool 项目地址: https://gitcode.com/gh_mirrors/it/itksnap 在医学影像分析领域,精确的分割技术是诊断、治疗规划和科学研究的基础。…...
别再只当下载器了!手把手教你用Keil+STLink/JLink玩转STM32在线调试与变量监视
从烧录到调试:解锁STM32开发中仿真器的完整潜力 当你第一次拿到STM32开发板时,可能只把STLink或JLink当作一个简单的程序下载工具。但事实上,这些仿真器隐藏着强大的调试能力,能够彻底改变你的开发体验。想象一下,你可…...
实战踩坑:在华为ENSP上配置OSPF NSSA区域时,为什么外部路由没传出去?
华为ENSP实战:OSPF NSSA区域外部路由失效的深度排查指南 当你在华为eNSP模拟器中配置OSPF NSSA区域时,是否遇到过这样的困惑:明明按照文档配置了所有参数,外部路由却像被黑洞吞噬一样无法传递?这不是个例——根据企业网…...
AIGlasses OS Pro手势交互开发:MediaPipe骨骼识别实战教程
AIGlasses OS Pro手势交互开发:MediaPipe骨骼识别实战教程 1. 手势交互开发概述 智能眼镜作为可穿戴设备的新形态,其交互方式一直是技术难点。传统触摸屏在眼镜上的体验并不理想,而语音交互在公共场合又存在隐私问题。手势识别技术恰好能解…...
告别电脑!用iOS快捷指令给你的手机浏览器装个“开发者模式”
用iOS快捷指令打造移动端网页调试神器:零代码实现元素修改与数据抓取 在咖啡馆等方案时突然发现网页文案有误?通勤路上需要紧急抓取竞品价格数据?传统移动端浏览器缺乏开发者工具总让人束手无策。其实你的iPhone里藏着一位"隐形开发者&q…...
Audio Slicer终极指南:5步掌握免费音频智能分段技术
Audio Slicer终极指南:5步掌握免费音频智能分段技术 【免费下载链接】audio-slicer A simple GUI application that slices audio with silence detection 项目地址: https://gitcode.com/gh_mirrors/aud/audio-slicer 你是否曾面对长达数小时的录音素材&…...
跨平台开发体验:在WSL中流畅使用PyTorch 2.8深度学习镜像
跨平台开发体验:在WSL中流畅使用PyTorch 2.8深度学习镜像 1. 为什么选择WSLPyTorch? 对于Windows系统下的深度学习开发者来说,环境配置一直是个头疼的问题。原生Windows环境安装CUDA、配置PyTorch经常遇到各种兼容性问题,而虚拟…...
从零搭建你的第一个“家庭网络实验室”:ENSP + 虚拟PC + 云设备实战指南
从零搭建你的第一个“家庭网络实验室”:ENSP 虚拟PC 云设备实战指南 在卧室里复现企业级网络拓扑?用一台笔记本电脑模拟智能家居的完整数据流转?这不是科幻场景,而是每位网络技术爱好者都能实现的低成本学习方案。本文将手把手带…...
从实验室到报告:如何用Matplotlib把你的Python数据分析结果‘包装’成专业图表(含多子图布局与样式美化)
从实验室到报告:如何用Matplotlib把你的Python数据分析结果‘包装’成专业图表 在数据分析的最后一公里,图表质量直接决定成果的传达效率。当你的分析报告需要呈现在学术期刊、商业决策会议或投资人路演中时,基础plt.plot()生成的粗糙图表就像…...
