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文件上再点击右键,然后点击如下图的菜单:

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

posted on 2022-09-25 15:35  语风  阅读(479)  评论(0编辑  收藏  举报