python 这个bug是在OpenCV、Flask还是我的代码中?帧显示在预期之后...几小时后

xe55xuns  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(99)

我在写一个程序来记录工作上的午餐请求。它必须是简单和万无一失的老同事互动(想想70岁)。因此,我需要显示一条消息,以便人们知道系统目前不接受午餐请求,因为它是在截止时间之后。
所以我有一个时间(上午9点),之后我把程序放进一个时间检查循环,以防止进一步的互动,直到第二天午夜沿着时,它将打破循环,并再次开始接受订单。
问题是,无论我做什么,通知人们午餐请求已经完成的消息只会在午夜之后显示在视频提要上。我已经尝试了十几种不同的方法来做到这一点,除了根据不同的时间制作多个if语句,或者试图制作单一目的的变量标志来进行多个定时传递,因为真的谁想在应该工作的时候跳过这些箍(我认为......这就是为什么我在这里)。下面是我的代码的基本内容(为了清楚起见,我将删除一些根本不与框架交互的函数调用,并显示未按预期工作的部分):

while True: #this is in my generate frames function
    success, frame = camera.read()  # read the camera frame
    current_time = datetime.now().time() 
    today_nine_am = datetime.now().replace(hour=9, minute=0, second=0, microsecond=0) #compare against today at 9am
    if current_time >= today_nine_am.time():  # Check if current time is after 9:00 AM
            #add image "resdone" to frame
            frame = cv2.addWeighted(resdone, 1, frame, 0, 0) #I've tried putText here instead and the result is the same. I think I even tried an imshow, same thing.

#send opencv frames to flask's template index.html and stream to browser before locking down
    if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  

# the image should have been sent to the browser, so let's lock down till midnight
    while current_time >= today_nine_am.time():
            current_time = datetime.now().time()

#Here the program will loop back to the top

是的,有一点缺失,这是一个很长的程序,有很多部分,除了这个帧定时问题,所有工作都很好。这是我遇到问题的位置的帧输出的事件顺序。我修改框架,将其发送到浏览器,然后“锁定”程序直到午夜,但修改后的框架并没有在我期望的时候进入浏览器。它似乎是在这一帧之后发送的,只在午夜之后发送;除了在上午9点之后添加它的if语句之外。
这到底是怎么回事我可以用我的代码修复这个问题吗?或者我需要去做bug报告吗?
(不必要的信息:windows 10,CLI,python 3+,opencv(current from pip),flask(current from pip),firefox(current,auto-update))

hec6srdp

hec6srdp1#

新的一天,新的想法去尝试。这不是一个确切的修复,因为它是一个工作。在事件的预期顺序内推送到Web浏览器显然存在一些问题,但我设法找到了一种方法,在图像进入锁定之前将其推送到提要。

while True: #this is in my generate frames function
    success, frame = camera.read()  # read the camera frame
    current_time = datetime.now().time() 
    today_nine_am = datetime.now().replace(hour=9, minute=0, second=0, microsecond=0) #compare against today at 9am
    if current_time >= today_nine_am.time():  # Check if current time is after 9:00 AM
            #add image "resdone" to frame
            frame = cv2.addWeighted(resdone, 1, frame, 0, 0) #I've tried putText here instead and the result is the same. I think I even tried an imshow, same thing.

#send opencv frames to flask's template index.html and stream to browser before locking down
    if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  

# the image should have been sent to the browser, so let's lock down till midnight
    if current_time >= today_nine_am.time():  # Check if current time is after 9:00 AM   
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  # just yield twice when needed ... seems like a buffer problem.       
            print("about to loop till midnight")
            while current_time >= today_nine_am.time():
                current_time = datetime.now().time()
            

#Here the program will loop back to the top

因此,正如我在代码注解中所写的,这似乎是一个缓冲区问题。只有在需要的时候才推一个额外的产量来修复结果,但我仍然不确定这个问题。我希望能在这里得到一些帮助,但是...管他呢。
如果你在Python中使用OpenCV和Flask,当你希望帧在特定的时间出现时,执行顺序可能看起来不正常。在适当的时候获得额外的收益可能会起到作用。正如你在第15行和第19行看到的,有收益率。第19行上的是第二个,由于if语句,它只在上午9点之后运行。因为我们不介意在这个if语句之前运行一个帧,所以我们可以保留第15行的one语句。一旦时间超过了上午9点,这个延迟就变得不可接受了,所以我们运行一个额外的yield语句,如第19行。然后,它在程序进入循环之前推送该延迟帧,该循环一直运行到午夜,此时不再是>=今天上午9点。(希望楼主能欣赏一下这篇文章。其他人都没有读过这篇文章)。
根本的问题似乎是Flask,因为代码没有它也能正常工作。不过我真的只是建议使用除 flask 以外的东西。他们会自动删除发布到其github页面的所有问题,并忽略所有bug报告。它使他们看起来像他们有一个维护良好的存储库很少的努力。

相关问题