Как подсчитать количество советов на изображении в OpenCV?

У меня есть набор символов хирагана, и я хотел бы посчитать количество конечных точек / подсказок, которые имеет персонаж.

пример:
входное изображение:

введите описание изображения здесь

желаемое выходное изображение:

введите описание изображения здесь

Я пытался использовать выпуклый корпус

введите описание изображения здесь

код: (на основе учебника OpenCV Вот)

    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());
}
}

затем conrnerHarris (), но он возвратил слишком много нежелательных углов

введите описание изображения здесь

код: (на основе учебника OpenCV Вот)

    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++;
}
}
}

Обнаружено 11 углов.

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

[Я использую OpenCV 2.4.9.]

4

Решение

Я не склонен использовать OpenCV, так как могу получить то, что мне нужно ImageMagick, которая бесплатна и устанавливается в большинстве дистрибутивов Linux, а также доступна для OSX и Windows. Итак, я попробовал ImageMagick, и, возможно, вы можете адаптировать мои методы — это просто делается в командной строке.

# Thin input image down to a skeleton
convert char.jpg -threshold 50% -negate -morphology Thinning:-1 Skeleton skeleton.jpg

введите описание изображения здесь

# Find line-ends, using Hit-or-Miss morphology, and make them green (lime). Save as "lineends.jpg"convert skeleton.jpg -morphology HMT LineEnds -threshold 50% -fill lime -opaque white lineends.jpg

введите описание изображения здесь

# Find line-junctions, using Hit-or-Miss morphology, and make them red. Save as "line junctions.jpg"convert skeleton.jpg -morphology HMT LineJunctions -threshold 50% -fill red -opaque white linejunctions.jpg

введите описание изображения здесь

# Superpose the line-ends and line junctions into a result
convert lineends.jpg linejunctions.jpg -compose lighten -composite result.jpg

введите описание изображения здесь

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

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

composite -blend 30% skeleton.jpg result.jpg z.jpg

введите описание изображения здесь

4

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


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