【问题标题】:Django server crashes when accessing webcam with opencv使用 opencv 访问网络摄像头时 Django 服务器崩溃
【发布时间】:2018-07-03 20:17:03
【问题描述】:

所以我发现当我从代码中删除 cv2.imshow("Face",img) 时一切正常,但是在使用它时,服务器由于某种原因崩溃了。当作为不包括 django 代码的纯脚本运行时,代码运行完美。谁能告诉我为什么会这样以及可能的解决方案?谢谢

from django.shortcuts import render, redirect
import cv2
import numpy as np
from settings import BASE_DIR
def index(request):
    return render(request, 'index.html')

def create_dataset(request):
    userId = request.POST['userId']
    faceDetect = cv2.CascadeClassifier(BASE_DIR+'/ml/haarcascade_frontalface_default.xml')
    cam = cv2.VideoCapture(0)

    id = userId
    sampleNum = 0
    while(True):
        ret, img = cam.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = faceDetect.detectMultiScale(gray, 1.3, 5)
        for(x,y,w,h) in faces:
            sampleNum = sampleNum+1
            cv2.imwrite(BASE_DIR+'/ml/dataset/user.'+str(id)+'.'+str(sampleNum)+'.jpg', gray[y:y+h,x:x+w])
            cv2.rectangle(img,(x,y),(x+w,y+h), (0,255,0), 2)
            cv2.waitKey(500)

        cv2.imshow("Face",img)
        cv2.waitKey(1)
        if(sampleNum>35):
            break

    cam.release()
    cv2.destroyAllWindows()

return redirect('/')

这是堆栈跟踪

  • 进程:python2.7 [12301]
  • 路径:/Users/USER/*/python
  • 标识符:python2.7

  • 崩溃的线程:3

  • 异常类型:EXC_CRASH (SIGABRT)

  • 异常代码:0x0000000000000000, 0x0000000000000000
  • 异常说明:EXC_CORPSE_NOTIFY

  • 应用程序特定信息:

  • *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“+[NSUndoManager(NSInternal)_endTopLevelGroupings] 只能在主线程上安全调用。” 中止()调用 以 NSException 类型的未捕获异常终止

  • 应用程序特定的回溯 1: 0 核心基础 0x00007fffb40d32cb __exceptionPreprocess + 171 1 libobjc.A.dylib 0x00007fffc8eeb48d objc_exception_throw + 48 2 CoreFoundation 0x00007fffb40d8042 + [NSException raise:format:arguments:] + 98 3 基础 0x00007fffb5b20be0 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195 4 基础 0x00007fffb5aab093 +[NSUndoManager(NSPrivate)_endTopLevelGroupings] + 170 5 AppKit 0x00007fffb1b374ed-[NSApplication 运行] + 1200 6 QtGui 0x00000001141fbe44 _ZN26QEventDispatcherMacPrivate22ensureNSAppInitializedEv + 128 7 QtGui 0x00000001141fb5ff _ZN19QEventDispatcherMac13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE + 777 8 QtCore 0x0000000114e5dfdc _ZN16QCoreApplication13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE + 80 9 cv2.so 0x000000010e9cf53f cvWaitKey + 207 10 cv2.so 0x000000010e9cfba7 _ZN11GuiReceiver12createWindowE7QStringi + 359 11 cv2.so 0x000000010e9cf9a0 cvNamedWindow + 528 12 cv2.so 0x000000010e9d207a _ZN11GuiReceiver9showImageE7QStringPv + 170 13 cv2.so 0x000000010e9d1f49 cvShowImage + 553 14 cv2.so 0x000000010e9cab55 _ZN2cv6imshowERKNS_6StringERKNS_11_InputArrayE + 581 15 cv2.so 0x000000010dee3454 _ZL18pyopencv_cv_imshowP7_objectS0_S0_ + 404 16 libpython2.7.dylib 0x000000010b9598f4 PyEval_EvalFrameEx + 22980


解决了 ** python manage.py runserver --nothreading --noreload ** 命令的问题。显然整个过程由于某种原因不得不通过主线程。

【问题讨论】:

  • 你能从 Django 端发布堆栈跟踪或日志吗?这通常包含有价值的线索。
  • 感谢您的回复,我也更新了堆栈跟踪。

标签: django python-2.7 opencv


【解决方案1】:

您在这里似乎遇到的是对无头 Web 服务器环境的期望与期望访问屏幕的代码之间的不匹配。换句话说,Web 服务器请求处理程序和阻塞 UI 代码通常不兼容。

您可以在这里做的是删除cv2.waitKeycv2.imshow 调用,而是在完成cv2.rectangle 调用后保存额外的图像,将该图像名称传递给模板。在模板中,将该名称用作<img> 元素的src 属性的一部分。然后添加一个额外的请求处理程序,将带注释的图像返回给浏览器。

【讨论】:

  • 谢谢!解决了 ** python manage.py runserver --nothreading --noreload ** 命令的问题。显然,由于某种原因,整个过程必须通过主线程运行。
猜你喜欢
  • 2011-06-12
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2021-01-08
相关资源
最近更新 更多