|
# 关于OpenCV
OpenCV于1999年由Gary Bradsky在英特尔启动,2000年第一个版本发布。Vadim Pisarevsky加入了Gary Bradsky,负责管理英特尔的俄罗斯软件OpenCV团队。
2005年,OpenCV被用于赢得[2005年DARPA大挑战赛](https://en.wikipedia.org/wiki/DARPA_Grand_Challenge_(2005))的车辆。后来,它的积极发展继续在Willow Garage的支持下与Gary Bradsky和Vadim Pisarevsky领导该项目。OpenCV现在支持与计算机视觉和机器学习相关的许多算法,并且日益扩大。
OpenCV支持各种各样的编程语言,如C ++,Python,Java等,并且可以在包括Windows,Linux,OS X,Android和iOS在内的不同平台上使用。基于CUDA和OpenCL的高速GPU操作接口也在积极的发展。
OpenCV-Python是OpenCV的Python API,结合了OpenCV C ++ API的最佳特性和Python语言。
## OpenCV中的Python
OpenCV-Python是一个用于解决计算机视觉问题的Python绑定库。
Python是由Guido van Rossum开始的通用编程语言,它非常流行,主要是因为它的简单性和代码可读性。它使程序员能够在更少的代码行中表达想法,而不会降低可读性。
与C / C ++等语言相比,Python速度较慢。也就是说,Python可以通过C / C ++轻松扩展,这使得我们可以在C / C ++中编写计算密集型代码,并创建可用作Python模块的Python包装。这给了我们两个优点:第一,代码与原始C / C ++代码一样快(因为它是实际的C ++代码在后台工作),其次,它比Python C / C ++更容易编码。OpenCV-Python是原始OpenCV C ++实现的Python包装器。
OpenCV-Python使用Numpy,它是一个高度优化的库,用于使用MATLAB风格的语法进行数值运算。所有OpenCV阵列结构都转换成Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)更容易集成。
## OpenCV-Python教程
OpenCV引入了一套新的教程,它将引导您了解OpenCV-Python中可用的各种功能。本指南主要集中在OpenCV 3.x版本(尽管大多数教程也将与OpenCV 2.x一起使用)。
推荐使用Python和Numpy的以前的知识,因为本指南将不会介绍。熟练使用Numpy是必须的,以便使用OpenCV-Python编写优化的代码。
本教程最初由Abid Rahman K.开始,是Alexander Mordvintsev指导下的“Google Summer Code”计划的一部分。
## OpenCV需要你!
由于OpenCV是一个开源计划,欢迎所有人对图书馆,文档和教程做出贡献。如果您在本教程中发现任何错误(从小的拼写错误到代码或概念中的严重错误),请通过在GitHub中克隆OpenCV 并提交引用请求来随意更正。OpenCV开发人员将检查您的拉动请求,给您重要的反馈意见(一旦通过审核人员的批准),它将被合并到OpenCV中。然后,您将成为一个开源的贡献者 :-)
## 其他资源
* Python的快速指南 - Python的[一个字节](http://swaroopch.com/notes/python/)
* [基本的Numpy教程](http://wiki.scipy.org/Tentative_NumPy_Tutorial)
* [Numpy示例列表](http://wiki.scipy.org/Numpy_Example_List)
* [OpenCV文档](http://docs.opencv.org/)
* [OpenCV论坛](http://answers.opencv.org/questions/)
![basics](OpenCV-axis-basics.png "basics")
关于图像坐标系与行列宽高的对应关系大致如下:
- row == height == Point.y
- col == width == Point.x
![axis](axis.png "axis")
因为在计算机中,图像是以矩阵的形式保存的。
一张宽度640像素、长度480像素的灰度图保存在一个480 * 640的矩阵中。
## 先行后列
而我们习惯的坐标表示是先X横坐标,再Y纵坐标。
在OpenCV中需要对矩阵进行计算,先行再列。
## 补充(详细解释)
坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。~~(虽然网上有学着说opencv中有些数据结构的坐标原点是在图片的左下角,但是我暂时还没碰到过)。~~
在使用image.at(x1, x2)来访问图像中点的值的时候,x1并不是图片中对应点的x轴坐标,而是图片中对应点的y坐标。因此其访问的结果其实是访问image图像中的Point(x2, x1)点,即与image.at(Point(x2, x1))效果相同。
如果所画图像是多通道的,比如说image图像的通道数时n,则使用Mat::at(x, y)时,其x的范围依旧是0到image的height,而y的取值范围则是0到image的width乘以n,因为这个时候是有n个通道,所以每个像素需要占有n列。但是如果在同样的情况下,使用Mat::at(point)来访问的话,则这时候可以不用考虑通道的个数,因为你要赋值给获取Mat::at(point)的值时,都不是一个数字,而是一个对应的n维向量。
- # -*- coding: utf-8 -*-
- # @Time : 2019/01/25 20:13
- # @Author : dongfangyao
- # @File : OpenCV图像坐标系.py
- # @Software: PyCharm
- """
- OpenCV图像坐标系_test.py:
- OpenCV 图像处理 封装得非常好
- 下载opencv:https://www.lfd.uci.edu/~gohlke/pythonlibs/
- 通过whl文件安装 比较好
- opencv_python-4.0.1-cp36-cp36m-win_amd64.whl
- pip install wheel
- pip install xxx.whl
- opencv-python 4.0.1
- """
- import cv2
- # imread_unchanged
- img = cv2.imread('../data/Lenna.png', cv2.IMREAD_UNCHANGED)
- print('img.shape:', img.shape)
- logo = cv2.imread('../data/opencv_logo.png', cv2.IMREAD_UNCHANGED)
- print('logo.shape:(resize之前)', logo.shape)
- logo = cv2.resize(logo, (80, 80))
- print('logo.shape:(resize之后)', logo.shape)
- butterfly = cv2.imread('../data/butterfly.jpg', cv2.IMREAD_UNCHANGED)
- butterfly = cv2.resize(butterfly, (80, 80))
- print('butterfly.shape:', butterfly.shape)
- # cv2.imshow('src', img)
- # cv2.moveWindow('src', 200, 100)
- # cv2.waitKey(0)
- # cv2.moveWindow('src', 0, 0)
- # # read color values at position y, x
- y = 100
- x = 50
- # 100是height 50是width
- # 在坐标系中:100是纵坐标y
- (b, g, r) = img[y, x]
- # print color values to screen
- print('bgr:', b, g, r)
- #
- # #先行后列
- #img[y:y+height,x:width]
- # 两张图片的shape不一样
- # 图片的覆盖效果 指定位置 row col
- img[100:100 + logo.shape[0], 300:300 + logo.shape[1]] = logo[:, :, 0:3]
- # img[10:10+logo.shape[0],30:30+logo.shape[1],:]=logo[:,:,0:3]
- img[300:300 + butterfly.shape[0], 100:100 + butterfly.shape[1]] = butterfly[:, :, 0:3]
- # font_hershey_simplex
- font = cv2.FONT_HERSHEY_PLAIN
- # org是坐标
- cv2.putText(img, text='my name is dongfangyao', org=(100, 50), fontFace=font, fontScale=0.8, color=(255, 0, 0), thickness=2,bottomLeftOrigin=True) # text,
- # cv2.putText(img, text='col=width=X10,row=height-Y30', org=(10, 30), fontFace=font, fontScale=0.5, color=(0, 255, 0), thickness=2) # text,
- # cv2.putText(img, text='col=width=X100,row=height-Y300', org=(100, 300), fontFace=font, fontScale=0.5, color=(0, 255, 0), thickness=2) # text,
- # cv2.putText(img, text='col=width-X300,row=height-Y100', org=(300, 100), fontFace=font, fontScale=0.5, color=(0, 255, 0), thickness=2) # text,
- # cv2.imshow('img+logo', img)
- # cv2.imwrite('img_logo.jpg',img)
- # cv2.moveWindow('img+logo', x=img.shape[0], y=0)
- cv2.imshow('src', img)
- cv2.waitKey(0)
- print('end')
复制代码
|
|