Определить количество объектов, используя количество хитрых контуров Opencv

Я пытаюсь подсчитать количество сердец на следующем изображении, используя алгоритм обнаружения контуров и четкие контуры.

Входное изображение

Но после контуров я получил изображение, похожее на это, и оно получило контур 4 вместо 3. Какой метод я должен использовать, чтобы подсчитать любое количество объектов разных форм колоды карт. Мне нужно только количество символов в середине.

Выходное изображение

Вот мой код на C ++

#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

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector