Я использую cvHoughCircles найти два белых овалов в следующем изображении:OpenCV: Ошибка при использовании cvHoughCircles
я впервые использовал пороговая для обнаружения белых областей, а затем использовали преобразование хафа. Но выход не подходит правильно, как показано ниже:
Я не в состоянии понять, что происходит? Почему он обнаруживает 3 круга и почему только один обнаружен правильно? Какие-либо предложения?
Ниже мой код:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include<conio.h>
#include<malloc.h>
using namespace cv;
using namespace std;
int main() {
IplImage* image = cvLoadImage(
"testing.bmp",
CV_LOAD_IMAGE_GRAYSCALE
);
IplImage* src = cvLoadImage("testing.bmp");
CvMemStorage* storage = cvCreateMemStorage(0);
cvThreshold(src, src, 200, 255, CV_THRESH_BINARY);
CvSeq* results = cvHoughCircles(
image,
storage,
CV_HOUGH_GRADIENT,
3,
image->width/10
);
for(int i = 0; i < results->total; i++)
{
float* p = (float*) cvGetSeqElem(results, i);
CvPoint pt = cvPoint(cvRound(p[0]), cvRound(p[1]));
cvCircle(
src,
pt,
cvRound(p[2]),
CV_RGB(0xff,0,0)
);
}
cvNamedWindow("HoughCircles", 1);
cvShowImage("HoughCircles", src);
cvWaitKey(0);
}
Edit:
Поскольку я не получаю удовлетворительные результаты с преобразования Хока, я готов пойти на какой-то другой способ. Я могу предположить, что каждая белая блоба на рисунке имеет одинаковый размер (размер известен), а также известно расстояние между блобом. Есть ли нетривиальный способ найти вертикальную линию (касательную), касающуюся левой части левой белой капли? Как только я узнаю эту касательную, я получу представление о граничном расположении, затем нарисую круг в точке x = (это местоположение + радиус (который известен)), y = это местоположение. Могу ли я найти такие координаты x и y, используя некоторые нетривиальные способы?
решаемые путем изменения согласно ниже:
cvThreshold(image, image, 220, 255, CV_THRESH_BINARY);
cvCanny(image, image, 255, 255, 3);
cvNamedWindow("edge", 1);
cvShowImage("edge", image);
cvWaitKey(0);
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* results = cvHoughCircles(
image,
storage,
CV_HOUGH_GRADIENT,
4,
image->width/4, 100,100,0,50);
Вот результат:
Возможно, я не знаком с OpenCv, но разве вы не должны использовать краевое изображение, а не пороговое значение как вход для алгоритма Hough? –
с использованием обнаружения края канны, за которым следовал Hough Transformed! Но когда я беру другое изображение, больше нет. из белых капель, то же самое не удалось. – gpuguy
@ Андрей, как вы думаете, для определения овальной формы необходимо использовать ту же процедуру? (Потому что в моем случае на самом деле фигуры овальные, а не круговые) – gpuguy