【发布时间】:2019-01-23 11:49:54
【问题描述】:
我写了这段代码:
from Crypto.Cipher import AES
import numpy as np
import cv2, base64
BLOCK_SIZE = 16
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
secret = "youwanttoknowmysecretdontyouhaha"
cipher = AES.new(secret)
video = cv2.VideoCapture(0)
a = 0
while True:
a = a + 1
check, frame = video.read()
encrypted = EncodeAES(cipher, str(frame))
img = DecodeAES(cipher, encrypted)
cv2.imshow("Capturing", np.ndarray(img))
key = cv2.waitKey(1)
if key == ord('q'):
break
但它并没有像预期的那样工作。
我想让它播放我的实时摄像头,但它给了我以下错误:
Traceback(最近一次调用最后一次):文件“tester.py”,第 28 行,在 cv2.imshow("Capturing", np.ndarray(img)) ValueError: sequence too large;不能大于 32
我真的很想知道我做错了什么,不要只给我解决方案,而是请解释一下,我还在学习
编辑
我使用 python 2.7
编辑
以下代码有效,但我在主机将加密发送到另一台计算机的程序中使用它。在这种情况下你不能使用frame.dtype。
from Crypto.Cipher import AES
import numpy as np
import cv2, base64
BLOCK_SIZE = 16
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
secret = "youwanttoknowmysecretdontyouhaha"
cipher = AES.new(secret)
video = cv2.VideoCapture(0)
a = 0
while True:
a = a + 1
check, frame = video.read()
encrypted = EncodeAES(cipher, frame.tobytes())
decrypted = DecodeAES(cipher, encrypted)
img = np.frombuffer(decrypted, dtype=frame.dtype).reshape(frame.shape)
cv2.imshow("Capturing", img)
key = cv2.waitKey(1)
if key == ord("q"):
break
video.release()
但是我可以将 frame.dtype 发送到另一台计算机。
当我将frame.dtype和frame_shape的加密形式发送到计算机并解密并在那里使用时,我收到以下错误
img = np.frombuffer(decod_ed, dtype=img_dtype).reshape(img_shape)
TypeError: data type "ûÿùùÖÿùÖÿùÖÿÖÖÿÖÖÿÜÜÖøøÜ£ÜÖ£ÜÖÜÜÖÜÜÖÿÜÜÿÜÜÿÜøÖø£øøøøøøØ£ÿØ£ÿØ£ÿƒ×ÜØ×Ü׃øØƒÖøØùØØùØØùƒ£ÿ×øùƒ£ÿƒ£ÿƒøÜƒøÜíØ£íØ£íØ£óרóרóרóƒøóƒøúá£óƒøáƒøáƒø×ƒø×ƒø£ƒø£ƒø£ƒø£ƒøƒ×ÜáƒøúíøúíøÑáøÑáøñ×øÑƒ£ñØ×Ñ׃ñáƒñáƒóíØíá£áó£ƒíø×áÜ×áÜøƒÖ£áÜ£ƒø£ƒøƒØ£ƒØ£áרá×ØØØ£ØØ£×רƒƒ×ƒƒ×××Ø×ƒø×ƒø£ƒø£ƒø£×Ø£×Ø£×Ø£×ØØá£Øá£ØíøØíøáó£áó£×ó£ØíøÜƒøù£ÿôÜÿôÜÿÿÜÜÿÜÜøøøØØØíƒ×óáƒíƒ×íƒ×óáƒóáƒñúƒñúƒªÑíñúƒñúƒñúƒúó×úó×úó×úó×óó£óó£úñøúñøúúØññ×óñ×óñ×óúƒóúƒóóíóóíóúƒñÑíóªááñ××ñ××ñ××úƒáÑí׺á׺á£ñƒ£ñƒáúƒáúƒññúóóíúíáúíáííáññúññúññúñÑíñÑíóúƒñÑíñÑíñÑíóÑíóÑíóúƒóúƒñÑíñÑíñÑíóúƒáúƒóÑíóÑíáúƒƒó×áúƒóÑíóÑíóÑíáúƒáúƒƒó׃ó××íØØíøØíøØóÖØóÖØíø£áÜáá܃ƒÖíƒÖƒØùØ×òƒáùØáùÜØöÜØöÜØöÖ×òÿØöù£ôù£ôûÜöûÜööÜööÜöÆøöÆøööÜööÜöûÜööÿÆûùôûùôÿûòûöôÆöôöûòöûòöûòöûòÆöôÉòæÉòæÉûÉÉûÉÅòÅÅòÅæòÅÉöÄÉöÄÉöÄÉöÄÅôìÉÆîÅæïææïÉÉèÉÅåÉÅåîÅåèìäçîâåïéêîüêîüçï~çï~àïÇàïÇë|å|" not understood
【问题讨论】:
-
很可能图像的形状类似于 (480, 640, 3) 而解密图像的形状是 (921600)...您需要将数组重新整形为正确的形状
-
不要使用
ndarray。使用np.array(img),ndarray的第一个参数是形状,不能超过32个元素。在这种情况下查看文档。 -
@hpaulj 如果我用
np.array(img)替换np.ndarray(img)我得到这个错误:TypeError: mat data type = 18 is not supported -
好的,
img is a special kind of object, buffer or bytestring, that requires a kind of decoding thatnp.array` 无法处理。无论如何,它肯定不符合ndarray的shape参数。 -
如果它在另一台计算机上,也有重复的代码。但这并不重要。无论如何,dtype 和形状也需要序列化/反序列化。对于他们来说,你可以简单地使用 str。