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…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
Linux系统:进程间通信-匿名与命名管道
本节重点 匿名管道的概念与原理匿名管道的创建命名管道的概念与原理命名管道的创建两者的差异与联系命名管道实现EchoServer 一、管道 管道(Pipe)是一种进程间通信(IPC, Inter-Process Communication)机制,用于在不…...
