2

I recently installed OpenCV v2.2 on my Ubuntu 11 machine using instructions given at http://www.samontab.com/web/2011/06/installing-opencv-2-2-in-ubuntu-11-04/. Im able to run the sample C programs and some of the sample python programs too. But running python facedetect.py ~/img.jpg is giving me "Segmentation Fault".

What could be causing this problem and how can i fix it ?. Below is the code for 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")

Please Help Thank You

1 Answer 1

1

Same problem. I've tracked it down to cv.Load on the cascade. I'm on OS X 10.6, OpenCV 2.3.1, and Python 2.6. Here's the dump:

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

I hunted around some more and found https://code.ros.org/trac/opencv/ticket/983, which seems to indicate that this is due to OpenCV not being able to find the file. So double check that "../data/haarcascades/haarcascade_frontalface_alt.xml" exists relative to where you're executing it.

Sign up to request clarification or add additional context in comments.

1 Comment

Huh, yeah you're right. That's pretty strange since I installed 2.3.1, but maybe it was a previous install. At any rate, mine worked once I got the file right!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.