简体   繁体   English

将检测到的面部放入图像并使用python在opencv中的另一个窗口中显示

[英]putting the detected face into an image and display in another window in opencv using python

i'm new to image processing and opencv, but so far the easy to understand functions and good documentation have enabled me to try out and understand upto some level code like facedetection etc. 我是图像处理和opencv的新手,但到目前为止,易于理解的功能和良好的文档使我能够尝试并理解像facedetection等一些级别的代码。

Now when i detect the faces in the webcam video stream, the program draws a square around the face. 现在,当我在网络摄像头视频流中检测到面部时,程序会在脸部周围绘制一个正方形。 Now i want that much area of the image, in the square around the face, to be created as an another image. 现在我希望图像的大部分区域在脸部周围的方形中被创建为另一个图像。 From what i've been doing, i'm getting a rectangular area of the image in which the face is not even present. 从我一直在做的,我得到一个图像的矩形区域,其中面部甚至不存在。

i've used the cv.GetSubRect() and understood its use. 我已经使用了cv.GetSubRect()并了解它的用途。 Like for eg: 喜欢例如:

img=cv.LoadImage("C:\opencv\me.jpg")
sub=cv.GetSubRect(img, (700,525,200,119))
cv.NamedWindow("result",1)
cv.ShowImage("result",sub)
  • gives me the cropped picture of my eye. 给了我眼睛的裁剪图片。

But i can't get the face in my face and eye detection program. 但我不能在脸上和眼睛检测计划中得到面子。 Here's what i've done: 这就是我所做的:

min_size = (17,17)
        #max_size = (30,30)

        image_scale = 2
        haar_scale = 2

        min_neighbors = 2
        haar_flags = 0

        # Allocate the temporary images
        gray = cv.CreateImage((image.width, image.height), 8, 1)
        smallImage = cv.CreateImage((cv.Round(image.width / image_scale),cv.Round (image.height / image_scale)), 8 ,1)
        #eyeregion = cv.CreateImage((cv.Round(image.width / image_scale),cv.Round (image.height / image_scale)), 8 ,1)
        #cv.ShowImage("smallImage",smallImage)

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

        # Scale input image for faster processing
        cv.Resize(gray, smallImage, cv.CV_INTER_LINEAR)

        # Equalize the histogram
        cv.EqualizeHist(smallImage, smallImage)

        # Detect the faces
        faces = cv.HaarDetectObjects(smallImage, faceCascade, cv.CreateMemStorage(0),
        haar_scale, min_neighbors, haar_flags, min_size)
        #, max_size)

# If faces are found
        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(image, pt1, pt2, cv.RGB(255, 0, 0), 3, 4, 0)
                        face_region = cv.GetSubRect(image,(x,int(y + (h/4)),w,int(h/2)))
                        cv.ShowImage("face",face_region)


 cv.SetImageROI(image, (pt1[0],
                        pt1[1],
                        pt2[0] - pt1[0],
                        int((pt2[1] - pt1[1]) * 0.7)))
                eyes = cv.HaarDetectObjects(image, eyeCascade,
                cv.CreateMemStorage(0),
                eyes_haar_scale, eyes_min_neighbors,
                eyes_haar_flags, eyes_min_size)    

            if eyes:
                    # For each eye found
                    for eye in eyes:

                            eye[0][0],eye[0][1] are x,y co-ordinates of the top-left corner of detected eye
                            eye[0][2],eye[0][3] are the width and height of the cvRect of the detected eye region (i mean c'mon, that can be made out from the for loop of the face detection)
                            # Draw a rectangle around the eye


                            ept1 = (eye[0][0],eye[0][1])
                            ept2 = ((eye[0][0]+eye[0][2]),(eye[0][1]+eye[0][3]))

                            cv.Rectangle(image,ept1,ept2,cv.RGB(0,0,255),1,8,0) # This is working.. 


                            ea = ept1[0]
                            eb = ept1[1]
                            ec = (ept2[0]-ept1[0])
                            ed = (ept2[1]-ept1[1])

                            # i've tried multiplying with image_scale to get the eye region within
                            # the window of eye but still i'm getting just a top-left area of the 
                            # image, top-left to my head. It does make sense to multiply with image_scale right?




                            eyeregion=cv.GetSubRect(image, (ea,eb,ec,ed))
                            cv.ShowImage("eye",eyeregion)

I hope this code is from OpenCV/samples/Python. 我希望这段代码来自OpenCV / samples / Python。 There is a small mistake in the arguments you have given for the co-ordinates inside cv.GetSubRect. 你为cv.GetSubRect中的坐标给出的论点存在一个小错误。 Please replace last two lines of above program with following: 请用以下内容替换上述两行:

a=pt1[0]
b=pt1[1]
c=pt2[0]-pt1[0]
d=pt2[1]-pt1[1]
face_region = cv.GetSubRect(image,(a,b,c,d))
cv.ShowImage("face",face_region) 

Make sure, you have no false detection or multiple detection. 确保您没有错误检测或多重检测。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM