Detect number of objects using number of canny contours Opencv

1.6k views Asked by At

I try to count the number of hearts in the following image by using a canny edge detection algorithm and contours.

Input image

But after the contours I have gotten image like this and it has contoured 4 instead of 3. What kind of method I have to follow to count any number of object different shapes of deck card pack. I only need number of symbols in the middle.

Output image

Here is my c++ code

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/core/core.hpp>

#include <iostream>
#include <stdlib.h>
#include <stdio.h>


using namespace cv;
using namespace std;
Mat src;
Mat dst;
Mat canny_output;

//this is function for loading the image
void loadImage(char* source){
    Mat tmp;
    /// Load source image and convert it to gray
    src = imread( source, 1 );
    /// Convert image to gray and blur it
    cvtColor( src, tmp, CV_RGB2GRAY );
    //blur( src_gray, src_gray, Size(3,3) );
    bitwise_not( tmp, src);
}

void clearImage(){

    int i,j;
    int r = 10;

    Mat clone;
    src.copyTo(clone);

    for(i = 0;i < src.rows;++i){
        j = 0;
        clone.at<Vec3b>(i,j) = Vec3b(0,0,0);
        for(j = 0;j < src.cols;++j){
            if(src.at<cv::Vec3b>(i,j) == cv::Vec3b(255,255,255)){
                rectangle(
                    clone,
                    cv::Point(i-r, j),
                    cv::Point(i+r, j+r),
                    cv::Scalar(255, 255, 255)
                );
            }
        }
    }
}

void detectImages(){

    int thresh = 100;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    Canny( src, canny_output, thresh, thresh*2, 3 );
    /// Find contours
    findContours( canny_output, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

    cout<<(hierarchy.size())<<endl;
}

//corpping and resizing the image
void corpResizeImage(){
    int i,j;
    Vec3b intensity;
    intensity.val[0] = 0;
    intensity.val[1] = 0;
    intensity.val[2] = 0;

    cv::Rect myROI(src.cols/6,0, 2*src.cols/3, src.rows);
    Mat croppedImage = src(myROI);
    Size size(300,600);
    resize(croppedImage,src,size);//resize image

    for(i = 0;i < src.rows;++i){
        j = 0;
        if((i < src.rows/25)||(i < (src.rows/25))){
            for(j = 0;j < src.cols;++j){
                src.at<Vec3b>(i,j)= intensity;
            }
        }
    }
}

/** @function main */
int main( int argc, char ** argv )
{
    loadImage("img/3h.png");
    corpResizeImage();
    detectImages();
    /// Create Window
    char* source_window = "Source";
    namedWindow( source_window, CV_WINDOW_AUTOSIZE );
    imshow( source_window, canny_output );

    waitKey(0);
    return(0);
}
0

There are 0 answers