Python OpenCV cv.WaitKey 在 Ubuntu 上输出奇怪结果,模除 256 正确映射

9 投票
2 回答
4789 浏览
提问于 2025-04-17 12:29

我在使用Ubuntu 11.10(联想T400)和OpenCV 2.2(我相信因为我用的是import cv2.cv as cv)的时候遇到了一些问题。如果我只是用'import cv',问题也会出现。

最近我开始遇到这个问题,感觉有点奇怪。我不知道自己做了什么特别的事情,自从出现这个问题后我也重启过电脑。我安装了几个程序,但我觉得这些不会影响到这个问题。

当我运行一个显示人工图像的程序(就是一张黑色的图片)时,我尝试使用cv.WaitKey(10)来获取键盘输入,但返回的结果很奇怪。

这是我的OpenCV代码:

import cv2.cv as cv
import time

cv.NamedWindow("camera", 1)
img = cv.CreateImage((400,400), 8, 3)
valkeys = range(1,255)
f = open('/home/andrew/webuploads/keyboardtest', 'wb')
while True:
    cv.ShowImage("camera", img)
    k = cv.WaitKey(10)
    if k is -1:
        pass
    else:
        print 'writing %s' %str(k)
        f.write((str(k)+' '))

f.close()

这是我从程序中得到的输出:

1048678 1048676 1048673 1048691 1048676 1048678 1048689 1048695 1048677 1048688 1048687 1048681 1048677 1048677 1048695 1048624 1048633 1048690 1048633 1048624 1048695 1048677 1048690 1048624 1048633 1048681 1048677 1048681 1048688 1048687 1048677 1048681 1048692 1048688 1048681 1048688 1048687 1048681 1048681 1048688 1048687 1048585 1048687 1048681 1048688 1048687 1048681 1114085 1179728 1179727 1179721 1179728 1179721 1245153 1245289 1179727 1179721 1179727 1179721 1179728 1179727 1245155 1441865 1179728 1179727 1179721 1179728 1179727 1179721 1179728 1179727 1179718 1179721 1179716 1179728 1179727 1179731 1179721 1179713 1179728 1179727 1179687 1179723 1179716 1179736 1179724 1179715 1179734 1179725 1179692 1179736 1179738 1179725 1179715 1179734 1179692 1245155 1441859

现在我可以对这些数字取模256,得到一些比较合理的结果(我刚试过,确实能正确识别所有按键),但我为什么需要这样做呢?之前不需要这样做(用print chr(k)可以直接得到字母)。有没有人知道这是为什么?

2 个回答

3

在当前的Ubuntu 13.04版本中,使用的OpenCV包是v2.4.2,这个问题依然存在:

无论是用 k % 256 还是 k & 255,都会把 -11048831 都映射到 255。为了区分这两种情况,我们需要额外检查一下,比如用 key < 0

但是如果你减去 0x100000,那么 1048831 会映射到 255,而 -1 会映射到 -1048577,这就意味着“没有按键”只会映射到一个负值。

k = cv2.waitKey(delay)
k -= 0x100000
if (k == 27):
    print("<Esc>")
10

取模运算之所以有效,是因为关于密钥的信息存储在返回值的最后8位中。用 k & 255 也可以提取出最后8位:

>>> k = 1048678
>>> chr(k & 255)
'f'

在Python中,chr(n) 会返回与n对应的字符。不过,OpenCV的文档对此问题没有提供任何信息

撰写回答