2011-09-04 85 views
2

我最近在我的Ubuntu 11機器上安裝了OpenCV v2.2,使用http://www.samontab.com/web/2011/06/installing-opencv-2-2-in-ubuntu-11-04/給出的指令。我能夠運行示例C程序和一些示例Python程序。但運行python facedetect.py ~/img.jpg正在給我「分段錯誤」。OpenCV 2.2中的人臉檢測python代碼的分割錯誤錯誤

什麼可能導致這個問題,我該如何解決它?以下是facedetect.py的代碼。

#!/usr/bin/python 
""" 
This program is demonstration for face and object detection using haar-like features. 
The program finds faces in a camera image or video stream and displays a red box around them. 

Original C implementation by: ? 
Python implementation by: Roman Stanchak, James Bowman 
""" 
import sys 
import cv 
from optparse import OptionParser 

# Parameters for haar detection 
# From the API: 
# The default parameters (scale_factor=2, min_neighbors=3, flags=0) are tuned 
# for accurate yet slow object detection. For a faster operation on real video 
# images the settings are: 
# scale_factor=1.2, min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING, 
# min_size=<minimum possible face size 

min_size = (20, 20) 
image_scale = 2 
haar_scale = 1.2 
min_neighbors = 2 
haar_flags = 0 

def detect_and_draw(img, cascade): 
    # allocate temporary images 
    gray = cv.CreateImage((img.width,img.height), 8, 1) 
    small_img = cv.CreateImage((cv.Round(img.width/image_scale), 
        cv.Round (img.height/image_scale)), 8, 1) 

    # convert color input image to grayscale 
    cv.CvtColor(img, gray, cv.CV_BGR2GRAY) 

    # scale input image for faster processing 
    cv.Resize(gray, small_img, cv.CV_INTER_LINEAR) 

    cv.EqualizeHist(small_img, small_img) 

    if(cascade): 
     t = cv.GetTickCount() 
     faces = cv.HaarDetectObjects(small_img, cascade, cv.CreateMemStorage(0), 
            haar_scale, min_neighbors, haar_flags, min_size) 
     t = cv.GetTickCount() - t 
     print "detection time = %gms" % (t/(cv.GetTickFrequency()*1000.)) 
     if faces: 
      for ((x, y, w, h), n) in faces: 
       # the input to cv.HaarDetectObjects was resized, so scale the 
       # bounding box of each face and convert it to two CvPoints 
       pt1 = (int(x * image_scale), int(y * image_scale)) 
       pt2 = (int((x + w) * image_scale), int((y + h) * image_scale)) 
       cv.Rectangle(img, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0) 

    cv.ShowImage("result", img) 

if __name__ == '__main__': 

    parser = OptionParser(usage = "usage: %prog [options] [filename|camera_index]") 
    parser.add_option("-c", "--cascade", action="store", dest="cascade", type="str", help="Haar cascade file, default %default", default = "../data/haarcascades/haarcascade_frontalface_alt.xml") 
    (options, args) = parser.parse_args() 

    cascade = cv.Load(options.cascade) 

    if len(args) != 1: 
     parser.print_help() 
     sys.exit(1) 

    input_name = args[0] 
    if input_name.isdigit(): 
     capture = cv.CreateCameraCapture(int(input_name)) 
    else: 
     capture = None 

    cv.NamedWindow("result", 1) 

    if capture: 
     frame_copy = None 
     while True: 
      frame = cv.QueryFrame(capture) 
      if not frame: 
       cv.WaitKey(0) 
       break 
      if not frame_copy: 
       frame_copy = cv.CreateImage((frame.width,frame.height), 
              cv.IPL_DEPTH_8U, frame.nChannels) 
      if frame.origin == cv.IPL_ORIGIN_TL: 
       cv.Copy(frame, frame_copy) 
      else: 
       cv.Flip(frame, frame_copy, 0) 

      detect_and_draw(frame_copy, cascade) 

      if cv.WaitKey(10) >= 0: 
       break 
    else: 
     image = cv.LoadImage(input_name, 1) 
     detect_and_draw(image, cascade) 
     cv.WaitKey(0) 

    cv.DestroyWindow("result") 

請幫助 謝謝

回答

1

同樣的問題。我已將它追蹤到cv.Load級聯。我在OS X 10.6,OpenCV 2.3.1和Python 2.6上。下面是轉儲:

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000 
Crashed Thread: 0 Dispatch queue: com.apple.main-thread 

Thread 0 Crashed: Dispatch queue: com.apple.main-thread 
0 libopencv_objdetect.2.2.dylib 0x00000001007b2899 cv::RTTIImpl<cv::HOGDescriptor>::isInstance(void const*) + 41 
1 libopencv_core.2.2.dylib  0x000000010113b65f cvTypeOf + 47 
2 cv.so       0x00000001004ba12e pycvLoad(_object*, _object*, _object*) + 206 
3 org.python.python    0x00000001000b8d48 PyEval_EvalFrameEx + 28696 
4 org.python.python    0x00000001000b9af5 PyEval_EvalCodeEx + 2197 
5 org.python.python    0x00000001000b9c16 PyEval_EvalCode + 54 
6 org.python.python    0x00000001000dea6e PyRun_FileExFlags + 174 
7 org.python.python    0x00000001000ded29 PyRun_SimpleFileExFlags + 489 
8 org.python.python    0x00000001000ee40c Py_Main + 2764 
9 org.python.python    0x0000000100000f14 0x100000000 + 3860 

我找遍周圍多一些,發現https://code.ros.org/trac/opencv/ticket/983,這似乎表明,這是由於OpenCV中未能找到該文件。所以請仔細檢查「../data/haarcascades/haarcascade_frontalface_alt.xml」是否存在於您執行它的位置。

+0

你的崩潰日誌顯示OpenCV 2.2不是2.3.1 –

+0

嗯,是的,你是對的。這很奇怪,因爲我安裝了2.3.1,但也許它是以前的安裝。無論如何,我一收到文件就立即工作! – sbirch