I have a set of hiragana characters and I would like to count the number of end points/ tips the character have.
example: input image:
desired output image:
I have tried using convex hull
code: (based on opencv tutorial here)
findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<vector<Point> >hull(contours.size());
for (int i = 0; i < contours.size(); i++)
{
convexHull(Mat(contours[i]), hull[i], false);
}
Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
if (hierarchy[i][3] == 0) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point());
}
}
then conrnerHarris() but it returned too many undesired corners
code: (based on opencv tutorial here)
int blockSize = 2;
int apertureSize = 3;
/// Detecting corners
drawing = binarizeImage(drawing); // otsu's
cornerHarris(drawing, dst, blockSize, apertureSize, 0.04, BORDER_DEFAULT);
/// Normalizing
normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
convertScaleAbs(dst_norm, dst_norm_scaled);
int countCorner = 0;
/// Drawing a circle around corners
for (int j = 0; j < dst_norm.rows; j++)
{
for (int i = 0; i < dst_norm.cols; i++)
{
if ((int)dst_norm.at<float>(j, i) > 50)
{
circle(output, Point(i, j), 2, Scalar::all(255), -1, 8, 0);
countCorner++;
}
}
}
It detected 11 corners.
I'm thinking that this might be the same as a finger tip detection, but I don't know how to do it.
[I'm using OpenCV 2.4.9.]