Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中转换为字符串_Python_Opencv - Fatal编程技术网

在python中转换为字符串

在python中转换为字符串,python,opencv,Python,Opencv,我正在进行我的项目,我想从我的网络摄像头捕获视频帧并用python发送到远程客户端,我使用opencv捕获帧,但我必须将其逐帧发送到远程客户端,而不保存在服务器中。。。 我被困在这里已经一个星期了,请帮帮我 我是否必须将其转换为字符串以通过套接字发送?如果是,那怎么办? 请帮助我我的代码是 import cv2 import socket import base64 host = "localhost" port = 6052 s = socket.socket(socket.AF_INET

我正在进行我的项目,我想从我的网络摄像头捕获视频帧并用python发送到远程客户端,我使用opencv捕获帧,但我必须将其逐帧发送到远程客户端,而不保存在服务器中。。。 我被困在这里已经一个星期了,请帮帮我 我是否必须将其转换为字符串以通过套接字发送?如果是,那怎么办? 请帮助我我的代码是

import cv2
import socket
import base64

host = "localhost"
port = 6052

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(5)
print "server started...."
#if __name__ == "__main__":
while True:
    c, addr = s.accept()
    print "client connected..."
    capture = cv2.cv.CaptureFromCAM(0)
    #cv2.cv.NamedWindow('image')
    frame = cv2.cv.QueryFrame(capture)
    #cv2.cv.ShowImage('image', frame)
    #succ, ig = cv2.cv.LoadImage(capture)
    with open(frame,"rb") as f:
        es = base64.b64encode(f.read())
        stri = str.decode('base64','strict')
        print "string is " + stri
    #with open(ig, "rb") as f:
    #   b = f.read(87029)
    #  print "data = " + b
   # c.send(b)


   #k = cv2.cv.WaitKey(10)

   #if k % 256 ==27 :
        #break

#cv2.DestroyWindow('image')
    s.close()

我想你要解决的问题是:

c.send(b)
如果您阅读以下文件:

将数据发送到套接字。插座必须连接到远程插座。可选标志参数的含义与上面的
recv()
相同。返回发送的字节数应用程序负责检查所有数据是否已发送;如果仅传输了部分数据,则应用程序需要尝试传输其余数据。有关此概念的更多信息,请参阅

事实上,打开TCP套接字后立即发送大量数据正是您希望它只发送部分数据的情况

您可以阅读链接的HOWTO,它将解释如何处理部分发送的缓冲区,但对于您的问题,因为您一次只处理一个客户端,没有并发性,所以您什么也不做,完成请求并挂断它,文档中的下一个功能会做您想要的一切


然而,这并不是代码中唯一的问题。例如,下一行是这样做的:

s.close
仅仅引用一个函数,而不使用
()
调用它,是没有效果的。结果证明这是一件好事,因为如果这有效果,它将关闭侦听器套接字,而不是客户端套接字。如果客户端等待关机,它将永远等待;同时,如果第二个客户端尝试连接,它将被拒绝



另外,如果您自己编写客户端,我敢打赌您只是使用了
b=s.recv(87029)
,这将有相同的问题:它不一定会接收87029字节,它会接收到任何高达这么多字节的内容。您必须循环
recv
添加到缓冲区,直到得到足够的缓冲。有关更多详细信息,请参阅。

除了其他答案中的问题,您还需要解决其他问题

返回图像对象。采用文件名或整数文件描述符。图像对象显然不是文件名,因此
open
将引发异常

获取可传递到
open
的文件名的唯一方法是,如果您有一个文件,例如,将帧保存到该文件中。你声称你有这样做的代码。大概在该代码中,您的代码与此类似:

cv2.cv.imwrite(filename, image, params)
f = open(filename, 'rb')
我不知道你用了什么样的params;
图像
可能是通过捕获帧读取的图像

该函数类似于
imwrite
,只是它在内存中的缓冲区中创建图像文件,而不是将其写入磁盘。它采用与
imwrite
相同的参数,只是使用了文件扩展名而不是完整的文件名(因为它不会将任何内容保存到磁盘,但它仍然需要知道什么类型的文件PNG、JPE等)

因此:

现在,
buf
是可以传递给
send

    的字节
  • 请永远不要尝试将图像转换为字符串,这完全是浪费
  • 是的,您必须对网络摄像头中的图像进行编码,但不能将其编码为base64(相反,您需要一个客户端可以读取的图像,比如内存中的png)
  • 不要使用不推荐使用的cv2.cv api,它很快就会消失(opencv 3.0)
  • 坚持一个众所周知的协议,比如MJPEG

导入cv2
从BaseHTTPServer导入BaseHTTPRequestHandler,HTTPServer
导入时间
捕获=无
类CamHandler(BaseHTTPRequestHandler):
def do_获得(自我):
打印自我路径
如果self.path.endswith('.mjpg'):
自我发送_响应(200)
self.send_头('Content-type','multipart/x-mixed-replace;boundary=--jpgboundary'))
self.end_头()
尽管如此:
尝试:
rc,img=capture.read()
如果不是rc:
持续
imgRGB=cv2.cvt颜色(img,cv2.COLOR_BGR2RGB)
r、 buf=cv2.imencode(“.jpg”,imgRGB)
self.wfile.write(“--jpgboundary\r\n”)
self.send_头('Content-type','image/jpeg')
self.send_头('Content-length',str(len(buf)))
self.end_头()
self.wfile.write(字节数组(buf))
self.wfile.write('\r\n')
睡眠时间(0.5)
除键盘中断外:
打破
返回
如果self.path.endswith('.html')或self.path==“/”:
自我发送_响应(200)
self.send_头('Content-type','text/html'))
self.end_头()
self.wfile.write(“”)
self.wfile.write(“”)
self.wfile.write(“”)
返回
def main():
全球捕获
捕获=cv2。视频捕获(0)
捕获设置(cv2.CAP\U PROP\U FRAME\U WITH,320);
捕获.设置(cv2.CAP\U PROP\U FRAME\U HEIGHT,240);
尝试:
服务器=HTTPServer(“”,9090),CamHandler)
打印“服务器已启动”
服务器。永远为您服务()
除键盘中断外:
capture.release()
server.socket.close()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
此代码的具体问题是什么?它做错了什么?问题在c行。发送(b),它说必须键入错误,我无法将帧发送到客户端。那么,什么是
b
?粘贴异常和回溯,并告诉我们
b
的类型。(如果您不知道,请询问Python:
print(type(b))
。另外,请告诉我们
cv2.cv.imwrite(filename, image, params)
f = open(filename, 'rb')
buf = cv2.cv.imencode(extension, image, params)
import cv2
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import time

capture=None

class CamHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        print self.path
        if self.path.endswith('.mjpg'):
            self.send_response(200)
            self.send_header('Content-type','multipart/x-mixed-replace; boundary=--jpgboundary')
            self.end_headers()
            while True:
                try:
                    rc,img = capture.read()
                    if not rc:
                        continue
                    imgRGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
                    r, buf = cv2.imencode(".jpg",imgRGB)
                    self.wfile.write("--jpgboundary\r\n")
                    self.send_header('Content-type','image/jpeg')
                    self.send_header('Content-length',str(len(buf)))
                    self.end_headers()
                    self.wfile.write(bytearray(buf))
                    self.wfile.write('\r\n')
                    time.sleep(0.5)
                except KeyboardInterrupt:
                    break
            return
        if self.path.endswith('.html') or self.path=="/":
            self.send_response(200)
            self.send_header('Content-type','text/html')
            self.end_headers()
            self.wfile.write('<html><head></head><body>')
            self.wfile.write('<img src="http://127.0.0.1:9090/cam.mjpg"/>')
            self.wfile.write('</body></html>')
            return

def main():
    global capture
    capture = cv2.VideoCapture(0)
    capture.set(cv2.CAP_PROP_FRAME_WIDTH, 320); 
    capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 240);
    try:
        server = HTTPServer(('',9090),CamHandler)
        print "server started"
        server.serve_forever()
    except KeyboardInterrupt:
        capture.release()
        server.socket.close()

if __name__ == '__main__':
    main()