gpt4 book ai didi

Python OpenCV 线程

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:17 25 4
gpt4 key购买 nike

Python 脚本从套接字中读取 png 图像,然后尝试使用 OpenCV 将其显示为慢速视频。有 2 个类 server.py 和 Worker.py。 Server.py 从套接字接收原始 png 并将其放入队列。在它自己的线程中,工作人员将 png 出队并显示它。只有第一张图片可以正常显示。尽管调用了 ShowImage 和 WaitKey,但其他图像不可见(即第一张图像仍然存在)。

线程模型对吗?似乎服务器套接字线程阻止了 OpenCV 线程的显示。有没有办法将服务器套接字放在后台线程上?从后台线程调用 ShowWIndow 和 WaitKey 是否正确?我对 Mac 上的 Python 或 OpenCV 线程了解不多。如有任何意见和建议,我们将不胜感激。

服务器.py:

#! /usr/bin/env python
import sys
import SocketServer
import socket
import subprocess
import time
import cv
import Worker
import ShowImage

HOST = 'andrew-rosenblums-macbook-pro.local'
PORT = 3001
FRAME_SIZE = 144*192
data = ''
worker = Worker.Worker()

class SingleTCPHandler(SocketServer.BaseRequestHandler):
imagesSaved = 0

"One instance per connection. Override handle(self) to customize action."
def handle(self):
# self.request is the client connection
print "connection received.."
while True:
#print "calling rcv"
messageLength = self.request.recv(6) # Read 6 ascii char image size
cv.WaitKey(30)
if (len(messageLength) > 0):
print "messageLength=" + messageLength
iLength = int(messageLength)
message = ''
while (iLength > 0):
if (iLength > 1024):
chunk = self.request.recv(1024)
else:
chunk = self.request.recv(iLength)
iLength -= len(chunk)
message += chunk
print "rcvd imsg of len=" + str(len(message))
worker.write(message)

if (SingleTCPHandler.imagesSaved == 0):
SingleTCPHandler.imagesSaved += 1

print "closing stream"
self.request.close()
print "done receiving"

def finish(self):
print "finish called"

class SimpleServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
# Ctrl-C will cleanly kill all spawned threads
daemon_threads = True
# much faster rebinding
allow_reuse_address = True

def __init__(self, server_address, RequestHandlerClass):
SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass)

if __name__ == "__main__":
server = SimpleServer((HOST, PORT), SingleTCPHandler)
# terminate with Ctrl-C
try:
print "waiting for connections..."
server.serve_forever()
except KeyboardInterrupt:
sys.exit(0)

worker .py

#! /usr/bin/env python
import time
from threading import Thread
from Queue import Queue
import sys
import cv
import cv2
import numpy as np
import Image
from cStringIO import StringIO

class Worker(Thread):

count = 0

def __init__(self):
Thread.__init__(self)

self.cvImage = None
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)

self.queue = Queue()
self.writer = None
# Daemon threads won't prevent process from exiting
self.setDaemon(True)

# Start ourselves automatically
self.start()
print "Worker started"

def run(self):
writer = None
while 1:
frame = None

try:
#frame = self.queue.get(block=False)
frame = self.queue.get()
print "display izeof rawImage=" + str(len(frame))

#convert to mat
pilImage = Image.open(StringIO(frame));#.convert("RGB");

bgrImage = np.array(pilImage)

cvBgrImage = cv.fromarray(bgrImage)
self.cvImage = cv.CreateImage(cv.GetSize(cvBgrImage),8,3)
cv.CvtColor(cvBgrImage, self.cvImage, cv.CV_BGR2RGB)

#show it
cv.ShowImage('display', self.cvImage)
cv.WaitKey(30)
self.cvImage = None
except:
frame = None

print "done with thread"

# Requests from main thread
def write(self, frame):
self.queue.put(frame)

def stop(self):
self.queue.put(None)

最佳答案

答案很简单:OpenCV 的ShowImageWaitKey 必须在主线程中。我猜这是 GUI 线程。 ServerSockets 被推送到它自己的线程,这在 Python 中非常容易。

你只需要这样的东西:

UDPThread = Thread(target = UDPServer.run)
s.start(UPDThread)

关于Python OpenCV 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com