【发布时间】:2021-08-12 19:49:22
【问题描述】:
首先,我正在尝试执行屏幕共享之类的操作,但遇到了一个错误。我试图逐行发送图像,但我发现它只能在 LAN 中工作,因为连接速度要好得多。然后我专门传输每个像素并自己构建阵列,这会非常慢。这是代码: 服务器端:
def getImg(socket,y,x):
pixels = []
print(x*y*3)
for a in range(x*y*3):
pixels.append(struct.unpack('i', socket.recv(4))[0])
if a%(x*y)==0:
pass
return np.array(pixels).reshape(y,x,3)
客户端:
def sendSS(img):
y, x, color = img.shape
print(y*x*3)
for a in range(y):
for b in range(x):
for m in img[a][b]:
socket.send(struct.pack('i', m))
错误是这样的:
(<class 'cv2.error'>, error("OpenCV(4.5.1) c:\\users\\appveyor\\appdata\\local\\temp\\1\\pip-req-build-wvn_it83\\opencv\\modules\\imgproc\\src\\color.simd_helpers.hpp:94: error: (-2:Unspecified error) in function '__cdecl cv::impl::`anonymous-namespace'::CvtHelper<struct cv::impl::`anonymous namespace'::Set<3,4,-1>,struct cv::impl::A0xeee51b91::Set<3,4,-1>,struct cv::impl::A0xeee51b91::Set<0,2,5>,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)'\n> Unsupported depth of input image:\n> 'VDepth::contains(depth)'\n> where\n> 'depth' is 4 (CV_32S)\n"), <traceback object at 0x0000023221307740>)
我构造 numpy 数组的方式效果很好:
import pyautogui
import cv2
import numpy as np
import pickle
import struct
from pprint import pprint as pp
ss = np.array(pyautogui.screenshot())
y,x,color = ss.shape
pixels = []
for a in range(y):
for b in range(x):
for m in ss[a][b]:
pixels.append(struct.pack('i',m))
pixels2 = []
for val in pixels:
pixels2.append(struct.unpack('i',val)[0])
pixels2 = np.array(pixels2).reshape((1080,1920,3))
cv2.imwrite('name.png',pixels2)
我怎样才能更快地传输并解决这个问题?
编辑: 这是发生错误的代码部分,它说深度是 4,但我确定图像的尺寸是 1080,1920,3,因为我可以打印它。
image = getImg(aSocket,y,x)
SS = cv2.cvtColor(image,cv2.COLOR_RGB2BGR) # error occurs in this line
aSocket.send('image is gotten'.encode('utf-8'))
print('image is gotten')
cv2.imwrite(f'{ip[0]}\{count}.png',SS)
【问题讨论】:
-
@Aldin19 - 你至少应该告诉错误发生在哪里。
-
@Armali 我现在添加了它。
-
@Armali,另外,我怎样才能显示 1080p 分辨率对应 6 兆字节的屏幕。我应该只传输改变的像素吗?或者有什么方法吗?
-
这段代码的帧率很慢
标签: python opencv sockets image-processing