Оцените уровень перекоса с помощью houghLines
Я хочу определить уровень перекоса по изображению. У меня есть следующий код:
public void analyse(CvMat img) {
rows = img.rows();
cols = img.cols();
// create edge-map from rois
CvMat edgeMap = cvCreateMat(rows, cols, CV_8UC1);
cvCanny(img, edgeMap, 100, 400, 3);
// transform to hough
CvMemStorage storage = cvCreateMemStorage(0);
lines = cvHoughLines2(edgeMap, storage, CV_HOUGH_PROBABILISTIC, 1,
EuclideanDistance euclideanDistance = new EuclideanDistance();
double maxDistance = Double.MIN_VALUE;
for (int i = 0; i < lines.total(); ++i) {
Pointer line = cvGetSeqElem(lines, i);
CvPoint pt1 = new CvPoint(line).position(0);
CvPoint pt2 = new CvPoint(line).position(1);
double distance = euclideanDistance.getDistance(pt1, pt2);
double currentAngle = Math.atan2(pt2.y() - pt1.y(),
pt2.x() - pt1.x())
* 180 / Math.PI;
System.out.println(currentAngle);
if (distance > maxDistance) {
skewAngle = currentAngle;
}
}
Мое тестовое изображение
Я думаю, что уровень перекоса на -16 градусов, но мой код говорит, что на 25...
For также распечатывает средний угол на 25. Что не так с моими параметрами?
// РЕДАКТИРОВАТЬ это рисунок из houghLines
Привет
1 ответ
Во-первых, так как у вас есть довольно четкий текст, я предлагаю вам использовать расширенное / эрозия до Canny and Hough. Вы получите гораздо больше очков в письмах, от которых Hough определенно выиграет.
Во-вторых, вы выбираете "лучший угол" в качестве максимального расстояния между двумя точками линии.
double distance = euclideanDistance.getDistance(pt1, pt2);
...
if (distance > maxDistance) {
skewAngle = currentAngle;
}
Это НЕ будет работать, потому что на самом деле Hough может обнаружить некоррелированную строку, которая длиннее любой строки текста:
Вы можете предложить лучший алгоритм, если будете отображать для себя каждый сделанный шаг - что вы получите после Кенни, какие строки произвело преобразование Хафа и т. Д.