Ask Your Question
1

cvBlobsLib problem; wrong dimensions for blob 0

asked 2013-02-06 14:23:02 -0600

unxnut gravatar image

updated 2013-02-06 14:24:42 -0600

I have a small image with a white dot on a black background. I am trying to extract the white dot with cvBlobsLib. However, I get a blob with area 2 and dimensions the same as the image dimensions. This blob appears at index 0. If I ignore this blob, I have correct results. Here is the image:

image description

My code is:

    //  Example of extracting and filtering the blobs of an image

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <cvblobs/BlobResult.h>

const char  IMG[]                   = "frame_seg.jpg";
const char  INPUT[]                 = "Input";
const char  THRESHOLD[]             = "Threshold";
const char  BLOBS[]                 = "Blob Extraction";

int main ( int argc, char ** argv )
{
    try
    {
        const char * img_file = ( argc == 2 ? argv[1] : IMG );

        // Load the source image and display it

        cv::Mat     image = cv::imread (  img_file, 0 );

        if ( image.empty() )
            throw ( std::string ( " File " ) +
                    std::string ( img_file ) +
                    std::string ( " not found" ) );

        cv::namedWindow ( INPUT, CV_WINDOW_AUTOSIZE );
        cv::imshow ( INPUT, image );
        cv::waitKey();

        // Apply thresholding and display it

        double thresh = 10.0;
        cv::threshold ( image, image, thresh, 255.0, cv::THRESH_BINARY );

        cv::namedWindow ( THRESHOLD, CV_WINDOW_AUTOSIZE );
        cv::imshow ( THRESHOLD, image );
        cv::waitKey();

        // Perform blob analysis

        CBlobResult     blobs;
        IplImage ipl_img = image.operator IplImage();
        blobs = CBlobResult( &ipl_img, NULL, 0 );
        blobs.Filter ( blobs, B_EXCLUDE, CBlobGetArea(), B_LESS, 1.0 );

        // Display filtered blobs and print information on those

        IplImage * blob_display = cvCreateImage ( image.size(), IPL_DEPTH_8U, 1 );
        memset ( blob_display->imageData, 0, blob_display->imageSize );
        std::cout << "Number of blobs found: " << blobs.GetNumBlobs() << std::endl;
        for ( int i = 0; i < blobs.GetNumBlobs(); i++ )
        {
            CBlob * current_blob = blobs.GetBlob(i);
            current_blob->FillBlob ( blob_display, cv::Scalar ( 255 ) );
            int posx = static_cast<int>( ( current_blob->MaxX() + current_blob->MinX() ) / 2 );
            int posy = static_cast<int>( ( current_blob->MaxY() + current_blob->MinY() ) / 2 );
            std::cout << "Blob area: " << current_blob->Area() << "\t";
            std::cout << "Blob position and dimensions: " << posx << ", " << posy << "\t" << current_blob->GetBoundingBox().width << ", " <<
                current_blob->GetBoundingBox().height << "\t\t" << std::endl;
        }

        cv::imshow ( BLOBS, cv::Mat ( blob_display ) );
        cv::waitKey();
    }
    catch ( std::string msg )
    {
        std::cerr << argv[0] << ": " << msg << std::endl;
        return ( 1 );
    }

    return ( 0 );
}

This has stumped me for a couple of days now. Can anyone please help? I just want to make sure that I get proper dimensions on blob 0.

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
0

answered 2013-02-06 14:45:07 -0600

unxnut gravatar image

Never mind. I found out that there is a one pixel boundary around the image that was the cause of my problem. My thresholding call emphasized the boundary which is hard to see by itself because it is so small. My problem should be fixed now.

edit flag offensive delete link more

Question Tools

Stats

Asked: 2013-02-06 14:23:02 -0600

Seen: 1,141 times

Last updated: Feb 06 '13