使用opencv

时间:2018-01-24 17:26:55

标签: django python-2.7 opencv

所以当我从代码中删除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

  • Crashed Thread:3

  • 异常类型:EXC_CRASH(SIGABRT)

  • 异常代码:0x0000000000000000,0x0000000000000000
  • 异常注意:EXC_CORPSE_NOTIFY

  • 特定应用信息:

  • ***由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:' + [NSUndoManager(NSInternal)_endTopLevelGroupings]只能在主线程上调用。&# 39; abort()调用 以NSException类型的未捕获异常终止

  • 应用程序特定的Backtrace 1: 0 CoreFoundation 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 run] + 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 **命令解决了这个问题。显然,由于某种原因,整个过程必须通过主线程。

1 个答案:

答案 0 :(得分:1)

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

您可以在此处执行的操作是移除cv2.waitKeycv2.imshow来电,而是在您完成cv2.rectangle来电后保存其他图片,并通过该图像名称为模板。在模板中,将该名称用作src元素的<img>属性的一部分。然后添加一个额外的请求处理程序,将带注释的图像返回给浏览器。