Last active
August 29, 2015 14:01
-
-
Save sinelaw/a8cd8bc8e4c5be6c1f5e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
data CvSize = CvSize { sizeWidth :: CInt, sizeHeight :: CInt } | |
deriving (Show, Eq) | |
instance Storable CvSize where | |
sizeOf _ = (#size CvSize) | |
alignment _ = alignment (undefined :: CInt) | |
peek ptr = do | |
w <- (#peek CvSize, width) ptr | |
h <- (#peek CvSize, height) ptr | |
return (CvSize w h) | |
poke ptr (CvSize w h) = do | |
(#poke CvSize, width) ptr w | |
(#poke CvSize, height) ptr h | |
liftCvSize ::(RealFrac c, Num b) => (b -> c) -> CvSize -> CvSize | |
liftCvSize f (CvSize w h) = CvSize (f' w) (f' h) | |
where f' = toFromIntegral f | |
liftCvSize2 :: (Num b, Num b1, RealFrac a) => (b -> b1 -> a) -> CvSize -> CvSize -> CvSize | |
liftCvSize2 f (CvSize w1 h1) (CvSize w2 h2) = CvSize (f' w1 w2) (f' h1 h2) | |
where f' = toFromIntegral2 f | |
instance AdditiveGroup CvSize where | |
zeroV = CvSize 0 0 | |
(^+^) = liftCvSize2 (+) | |
negateV = liftCvSize (0-) | |
instance VectorSpace CvSize where | |
type Scalar CvSize = Double -- todo: use CInt instead of Double here? | |
a *^ s = liftCvSize (a*) s |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-} | |
module AI.CV.OpenCV.CV where | |
import Foreign.C.Types | |
import Foreign.Ptr | |
#include <cxcore.h> | |
#include <cv.h> | |
class IplArrayType a | |
data CvArr | |
instance IplArrayType CvArr | |
data IplImage | |
instance IplArrayType IplImage | |
foreign import ccall unsafe "cv.h cvCanny" | |
c_cvCanny :: Ptr CvArr -> Ptr CvArr -> CDouble -> CDouble -> CInt -> IO () | |
cvCanny :: (IplArrayType i1, IplArrayType i2) => | |
Ptr i1 -> Ptr i2 -> CDouble -> CDouble -> CInt -> IO () | |
cvCanny src dst threshold1 threshold2 apertureSize = | |
c_cvCanny (fromArr src) (fromArr dst) (realToFrac threshold1) (realToFrac threshold2) apertureSize | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 cv2.cv as 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") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment