惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
云风的 BLOG
云风的 BLOG
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Announcements
Recent Announcements
IT之家
IT之家
Google DeepMind News
Google DeepMind News
罗磊的独立博客
爱范儿
爱范儿
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
U
Unit 42
MongoDB | Blog
MongoDB | Blog
S
SegmentFault 最新的问题
B
Blog
博客园 - 叶小钗
月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 语风

Label Studio数据标注--通过源码安装 对比python学julia(第四章:人工智能)--(第四节)绘画大师 对比python学julia(第四章:人工智能)--(第三节)目标检测 对比python学julia(第四章:人工智能)--(第二节)人脸识别 对比python学julia(第四章:人工智能)--(第一节)OpenCV编程初步(3) 对比python学julia(第四章:人工智能)--(第一节)OpenCV编程初步(2) 对比python学julia(第三章:游戏编程)--(第四节)捕鱼达人(5) 对比python学julia(第三章:游戏编程)--(第四节)捕鱼达人(4) 对比python学julia(第三章:游戏编程)--(第四节)捕鱼达人(3) 对比python学julia(第三章:游戏编程)--(第四节)捕鱼达人(2) 对比python学julia(第三章:游戏编程)--(第四节)捕鱼达人(1) 对比python学julia(第三章:游戏编程)--(第三节)疯狂摩托(3) 对比python学julia(第三章:游戏编程)--(第三节)疯狂摩托(2) 对比python学julia(第三章:游戏编程)--(第三节)疯狂摩托(1) 对比python学julia(第三章:游戏编程)--(第二节)公主迎圣诞(4) 对比python学julia(第三章:游戏编程)--(第二节)公主迎圣诞(3) 对比python学julia(第三章:游戏编程)--(第二节)公主迎圣诞(2) 对比python学julia(第三章:游戏编程)--(第二节)公主迎圣诞(1) 对比python学julia(第三章:游戏编程)--(第一节)初识游戏库(3)
对比python学julia(第四章:人工智能)--(第一节)OpenCV编...
语风 · 2022-09-25 · via 博客园 - 语风

 1.1.    OpenCV简介

  OpenCV 的全称是 Open Source Computer Vision Library(开源计算机视觉库),它是一个功能强大的跨平台开源计算机视觉库,可应用于人机互动、物体识别、图像分割、人脸识别、运动跟踪、机器人、运动分析、机器视觉、结构分析、汽车安全驾驶等诸多领域。

  OpenCV以优化的 C/C++ 编写, 提供C++,C,Python和Java接口,支持Windows,Linux,Mac OS, iOS和Android。

  针对Julia语言,OpenCV官方提供了“Julia OpenCV Binding”,即OpenCV绑定,不过其官方也申明,该Bindings只在Ubuntu和Mac上进行了测试。Windows可能可以工作,但目前尚未正式测试和支持。而且据笔者测试,在Julia1.7及以上版本,安装该绑定的OpenCV库不成功,1.6.4可以安装成功。(官方网址: https://docs.opencv.org/4.x/d8/da4/tutorial_julia.html )

  另外一个途径是使用第三方的OpenCV封装(wraper),目前找到两个https://github.com/JuliaOpenCV 和https://github.com/maxruby/OpenCV.jl。不过这两个版本都不适用于当前版本的Julia,且已经停更多年。现在Julia使用OpenCV的最好方法是使用PyCall.jl为OpenCV调用Python绑定。

  1.2.  安装OpenCV库

  在Python中安装OpenCV库,很简单,只要运行下面的命令:

  pip3 install opencv-python

  通常情况下。安装过程会非常顺利。但是在Julia中安装OpenCV会稍微复杂一点。通常通过Miniconda托管环境安装。

  首先打开Julia的REPL环境,按“]”键进入包管理器,输入以下命令

  (@v1.7) pkg> add PyCall

  (@v1.7) pkg> add Conda

  然后按“Ctrl+c”键,退出包管理器,输入以下命令,安装

  using Conda
  Conda.runconda(`install -c conda-forge opencv`)

  注意括号中的包括字符串的字符不是单引号,是键盘左上角的“`“键。

  安装完后输入以下命令:

  using PyCall
 const cv = pyimport("cv2")

  如果出现以下反馈,说明安装成功了。

  PyObject <module 'cv2'from 'C:\\Users\\...\\.julia\\conda\\3\\lib\\site-packages\\cv2.cp39-win_amd64.pyd'>

  1.3. OpenCV的Hello,world

  从这里开始学习OpenCV 编程。按照程序员的惯例,自然是从简单的 hello, world程序开始编写第一个OpenCV程序。

  原书示例程序32-1是一个Python版的0penCV 的 hello, world 程序。该程序从本地磁盘的一个文件中读取图像,然后在图像左上角输出一个蓝色的hello, world 文本,最后将该图像显示在一个窗口中。

  

  现在我们用Julia版的PyCall来实现这段代码:

using PyCall
②    cv2=pyimport("cv2")
    #从文件中读取图像
③    img = cv2.imread("images/face1.jpg")

④ rimg = permutedims(img, ndims(img):-1:1)
⑤ pyimg
= PyReverseDims(rimg)
    #设置文件的位置、字体、颜色等参数
⑥ pos
= (10, 50)
⑦ font
= cv2.FONT_HERSHEY_SIMPLEX
⑧ color
= (255, 0, 0)

    #在图像中显示文本"hello, world"
⑨ cv2.putText(pyimg,
"hello, world", pos, font, 2, color, 2)

    #显示图像窗口
⑩ cv2.imshow("Image", pyimg)

    #按任意键退出
⑪ cv2.waitKey(0)

    #销毁所有窗口
⑫ cv2.destroyAllWindows()

  对比Python和Julia的代码,可以看出虽然总体上差不多,本质上都是调用OpenCV库的相关方法对图片进行处理。但是从细节处我们可以发现还是有些不同的,Julia的代码相比Python的代码,对原始读取图片信息的img对象,进行了二次处理,这是为什么呢?下面我们逐一对上面的代码进行解读:

  代码①:引用PyCall才能与OpenCV交互

  代码②:利用PyCall提供的pyimport()方法导入OpenCV的cv2模块。

  代码③:使用cv2.imread()方法从文件中读取一个图像,存放在变量img 中。文件路径可以是相对路径或者绝对路径。如果给定的文件路径是错误的,该方法并不会报错,而是返回一个None值。

  代码④、⑤:变量img是以数组形式存储图像信息的,而Julia与Python的数组存储方式不同,Julia是列主数组,Python是行主数组。假如有这样一个数组:

A=[822991443545]

  按行优先存储,内存中形式如下:

  8 2 2 9 9 1 4 4 3 5 4 5

  列优先,内存格式:

  8 9 3 2 1 5 2 4 4 9 4 5

  使用函数permutedims()和函数PyReverseDims()对列主数组img进行转换,改变存储格式,得到OpenCV可以接受的变量pyimg。

  代码⑥~⑨:先定义 pos、font 和 color 三个变量,分别用于设定文本的左上角坐标、字体和颜色。然后使用cv2.putText()方法在pyimg图像上输出一个文本,该方法的参数依次为像文本、左上角坐标、字体、字体大小、颜色、字体粗细。

  代码⑩:使用cv2.imshow()方法将添加了 hello, world 文字的图像pyimg 显示在一个定的窗口中,窗口的名字为 Image。

  代码⑪:调用cv2.waitKey(0)方法,让窗口一直处于等待状态,直到按下键盘的某个键时才结束。

  代码⑫:调用cv2.destroyAllWindows()方法,将销毁所有打开的窗口。

  打开VSCode,新建hello_world.jl文件,输入以上代码,在该文件上点击右键,在出现的菜单中点击下图所示的菜单:

  运行可能会出现下列错误:

  cv::findDecoder imread_('images/face1.jpg'): can't open/read file: check file path/integrity

  这是由于我们代码中采用的是相对路径,而Julia的运行环境与我们的代码文件不在同一目录导致的,这时候在hello_world.jl文件上再点击右键,然后点击如下图的菜单:

  再次象前次一样运行,就可以了。下面是运行结果: