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是行主数组。假如有这样一个数组:
按行优先存储,内存中形式如下:
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文件上再点击右键,然后点击如下图的菜单:
再次象前次一样运行,就可以了。下面是运行结果:
标签:Python,python,代码,cv2,Julia,OpenCV,julia,world From: https://www.cnblogs.com/zjzkiss/p/16727879.html