First time here? Check out the FAQ!

Ask Your Question
1

coordinates of detected target

asked Jul 18 '13

MuathGH gravatar image

updated Oct 23 '0

hel

hello , im trying to recover the coordination of a detected target and print it , im not expert in openCV neither C++ , this is my first code and i really need you're help , here's the code:

 #include "stdafx.h"
#include <highgui.h>
#include <opencv2/video/background_segm.hpp>
#include<opencv2/opencv.hpp>
#include<vector>
#include<opencv2\imgproc\imgproc.hpp>
#include <cv.h>
#include <ostream>
#include<ostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{


    cv::BackgroundSubtractorMOG2 bg;
    bg.bShadowDetection=false;
    bg.nmixtures=3;
    bg.history=100;
    bg.varThreshold=10; 
    cv::Mat frame;
    cv::Mat fore;
    cv::Mat back;


    CvCapture* capture  = cvCaptureFromCAM(0); // capture from video device 


    cvNamedWindow("Orignal", CV_WINDOW_AUTOSIZE); // create a window to display the images
      cvNamedWindow("Processed", CV_WINDOW_AUTOSIZE); // create a window to display the images

    while(1) {

        frame=cvQueryFrame(capture);   // Grabs and returns a frame from a 
        bg.operator()(frame,fore);
        bg.getBackgroundImage(back);
        cv::erode(fore,fore,cv::Mat()); // to clear the noise   
        cv::dilate(fore,fore,cv::Mat()); // to smooth the objecty


        cv::imshow("Orignal",frame);
        cv::imshow("Processed",fore);

       if(cvWaitKey(10)==27) // to exit the loop using ESCP 

        break;
    }
 return 0;
}

so the detected object is in fore matrix , i need to get its X,Y position printed out .. is it possible ?

Preview: (hide)

1 answer

Sort by » oldest newest most voted
2

answered Jul 18 '13

First of all apply the findContours function onto the foreground image. This will look for contours in your binary image, around the blobs that you have segmented before with the background segmentation algorithm.

Each of these contours is found as a vector of points, which give you the exact location of the blob, in image coordinates. If this information is enough, then you can stop here.

Next step is to find the smallest bounding box for the blob, which will accurately describe the location of the blob, in fewer coordinates than the list of vector points. This can be done by applying the boundingRect function on each of the contours. This will return a rectangle object, which contains a x and y coordinate of the top left corner and a width and heigth parameter.

You could also calculate the mass center, using the moments of the contour as explained in this tutorial.

Preview: (hide)

Comments

ok , i applied the findContours function on the foreground image and boundingRect : cv::findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); cv::boundingRect(contours);

but every time i try to run the program , this happens : Unhandled exception at 0x000007fefd42a49d in test_For_opencv2_3.exe: Microsoft C++ exception: cv::Exception at memory location 0x0019de50..

MuathGH gravatar imageMuathGH (Jul 18 '13)edit

This is because you didn't create the contours matrix before adressing it, so basically you are acessing memory that doesn't exist, thus leading to this problem. Add Mat contours; right before it.

StevenPuttemans gravatar imageStevenPuttemans (Jul 18 '13)edit

Unhandled exception at 0x000007fefd42a49d in test_For_opencv2_3.exe: Microsoft C++ exception: cv::Exception at memory location 0x002bd810..

same thing , i've created the matrix but still get this error

MuathGH gravatar imageMuathGH (Jul 18 '13)edit

Use debugger and check at what location/rule it exactly crashes, I have the idea that something must be going wrong before this.

StevenPuttemans gravatar imageStevenPuttemans (Jul 18 '13)edit

Question Tools

Stats

Asked: Jul 18 '13

Seen: 4,713 times

Last updated: Jul 18 '13