本来在学习实践另一片文章的时候,不知道opencv的坐标原点在哪里,但是通过猜测原来文章的注释发现,那篇文章所用的坐标原点的应该是在窗口的左上角,有了猜测就需要证明了。于是搜肠刮肚的有了下面的测试代码。
很简单,就是画一个空的窗口,然后准备在上面指定不同的点point来证明坐标原点是在坐上角。
下面的代码是先创建一个窗口;
import numpy as np
import cv2
win1=np.zeros([100,300,3],np.uint8)
win1[:]=(0,0,255)
#cv2.namedWindow("windows-1")
print(win1)
cv2.imshow("win-1",win1)
cv2.waitKey(0)
创建的结果如下图:
流程很简单,就是创建一个3维数组,然后给每个元素都赋值为255,然后把这个数组给cv2.imshow()传过去就行了。这个3维的数组分别表示RGB3个分量的值,在给数组赋值的时候把RGB中的R赋值为255。此处注意:opencv中的RGB顺序和我们常用的顺序是相反的,也就是opencv中把R分量的值放在memory的最后。
解下来在窗口中随便位置指定一个点就行了,主要是看看x和y是的原点是哪里。
上面的line33首先使用zero创建了一个100*300的矩阵。
win1这是一个100行x300列的矩阵。什么意思呢?这是矩阵的命名方法。就是它有100个像素高(100行嘛),300个像素长(300列嘛)。也就是如果用横轴x表示长的话,它的长度是300,可以在300内取值。用纵轴y表示高的话,它的高度是100,可以在100内取值。这里有一个地方需要注意一下,就是100*300中的100并不是对应这个点坐标(x,y)中的x,而是对应着y;300是对应着x的。为什么会强调这点呢?下面会用到:)
最后,line38创建的win1的矩阵是这样的:
[[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
...,
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
...,
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
...,
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
...,
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
...,
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
...,
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
...,
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]]
上面是line36的输出结果。系统自动加了很多的省略号,算了,我换一下参数,重新输出,主要是看zeros的用法:
win1=np.zeros([10,30,3],np.uint8)
win1[:]=(0,0,255)
win1[5,0]=(255,255,0)
#cv2.namedWindow("windows-1")
print(win1)
cv2.imshow("win-1",win1)
cv2.waitKey(0)
[[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[255 255 0]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]
[[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]
[ 0 0 255]]]
可以看到,输出的结果有10段,每段有30个元素,这其实就对应着10行30列。每个元素都是一个1维的数组,有3个数据,传给后面的namedwindow()后分别代表BGR三分色。注意Opencv的三分色是按照BGR排列的。
解下来是win[:]=(0,0,255) 是把win1这个数组从头到尾的都用(0,0,255)来初始化赋值,也就是每个像素都是红色。这是python中的数组的用法。
接下来的win[5,0]=(255,255,0)是把第5行,第0列对应的元素的值设置为(255,255,0)
效果如下图:
这个太小了,我放大一点。
再换个其他的点:
这次使用了100*300的矩阵,修改了第0行,第100列的那个点为白色(255,255,255),仔细看,在第0行的100列(约1/3处)有个白点,就是小了点儿。
所以,猜测的坐标原点是在左上角是对的。x轴是从原点水平向右正向增大,y轴是从原点竖直向下正向增大。
=======
补充,查到资料说还可以根据originde 的值 IPL_ORIGIN_TL和IPL_ORIGIN_BL来判断原点的位置,但问题是,我不知道怎么用python获取到IplImage这个对象,后来又了解到OpenCV的python-API中没有IplImage这个类型,那就不能用这个方法了。待续吧。