Форум программистов, компьютерный форум CyberForum.ru

Как найти расстояние между 2 линиями (OpenCV)? - C++

Восстановить пароль Регистрация
 
MValeriy
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 28
27.10.2015, 10:20     Как найти расстояние между 2 линиями (OpenCV)? #1
Доброго времени Суток!
у меня следующий вопрос. я с камеры получаю картинку с помщью OPENCV, и с помощью функций Canny и ROI получаю следующий результат. как можно, или можно ли вообще расчитать расстояние(pixel) между двумя краями(Линиями)?
буду очень признателен за помощь


Как найти расстояние между 2 линиями (OpenCV)?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
27.10.2015, 19:21     Как найти расстояние между 2 линиями (OpenCV)? #2
линии на изображении можно найти с помощью алгоритма Хафа http://docs.opencv.org/doc/tutorials...ugh_lines.html
можно из найденных отбросить те которые не начинаются близко к верху изображения и не заканчиваются ближе к низу. по найденным линиям найти расстояние между ними уже не составит труда.
MValeriy
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 28
28.10.2015, 10:58  [ТС]     Как найти расстояние между 2 линиями (OpenCV)? #3
а можно находить их с помощью оператора Сanny? http://docs.opencv.org/doc/tutorials..._detector.html

Добавлено через 32 минуты
На сколько я понял, оператор Canny Находит границы обьекта, могу ли я работать с ними?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
28.10.2015, 11:15     Как найти расстояние между 2 линиями (OpenCV)? #4
Цитата Сообщение от MValeriy Посмотреть сообщение
а можно находить их с помощью оператора Сanny?
Канни находит все зоны, похожие на границы, выделить линии им не получится
MValeriy
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 28
28.10.2015, 16:48  [ТС]     Как найти расстояние между 2 линиями (OpenCV)? #5
а что насчет функции findContours?
http://docs.opencv.org/master/d3/dc0...7cf18403e1689a

с ее помощью я получил следующее: http://pix.sevelina.ru/images/2015/10/28/1234.jpg

Добавлено через 40 минут
Воспользовался вашим советом. Тобишь функцией HoughLinesP и вот что получилось: http://pix.sevelina.ru/images/2015/10/28/345.jpg

Как быть дальше? Линии вроде бы как найдены) как найти расстояние между ними?

Добавлено через 2 минуты
или вот опять же с ROI http://pix.sevelina.ru/images/2015/10/28/3456.jpg
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
28.10.2015, 20:01     Как найти расстояние между 2 линиями (OpenCV)? #6
Цитата Сообщение от MValeriy Посмотреть сообщение
Как быть дальше? Линии вроде бы как найдены) как найти расстояние между ними?
каждая линия задана 2-мя точками, возьми среднее и вычти

Цитата Сообщение от MValeriy Посмотреть сообщение
а что насчет функции findContours?
хорошая функция. можешь поэксперементировать также с площадью объекта (cv::contourArea), опоясывающим прямоугольником или кругом (cvBoundingRect и cvMinEnclosingCircle), например диаметр опоясывающего круга с высокой вероятностью даст длину объекта.

нужный контур (объекта) можно отобрать путем выбора самого большого по площади либо по длине контура и после предварительной фильтрации (может быть ты это уже сделал)
MValeriy
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 28
29.10.2015, 12:22  [ТС]     Как найти расстояние между 2 линиями (OpenCV)? #7
Цитата Сообщение от OstapBender Посмотреть сообщение
каждая линия задана 2-мя точками, возьми среднее и вычти
а есть пример как это сделать? как получить координаты точек, и как собственно вычислить потом расстояние между ними? Что то никак не могу добраться до истины

Добавлено через 3 минуты
Если можно на примере программки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
 
#include <iostream>
 
using namespace cv;
using namespace std;
 
void help()
{
 cout << "\nThis program demonstrates line finding with the Hough transform.\n" << endl;
}
 
int main(int argc, char** argv)
{
 const char* filename = argc >= 2 ? argv[1] : "2.jpg";
 
 Mat src = imread(filename, 0);
 if(src.empty())
 {
     help();
     cout << "can not open " << filename << endl;
     return -1;
 }
 
 Mat dst, cdst;
 Canny(src, dst, 50, 200, 3);
 cvtColor(dst, cdst, CV_GRAY2BGR);
 
 #if 0
  vector<Vec2f> lines;
  HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );
 
  for( size_t i = 0; i < lines.size(); i++ )
  {
     float rho = lines[i][0], theta = lines[i][1];
     Point pt1, pt2;
     double a = cos(theta), b = sin(theta);
     double x0 = a*rho, y0 = b*rho;
     pt1.x = cvRound(x0 + 1000*(-b));
     pt1.y = cvRound(y0 + 1000*(a));
     pt2.x = cvRound(x0 - 1000*(-b));
     pt2.y = cvRound(y0 - 1000*(a));
     line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
  }
 #else
  vector<Vec4i> lines;
  HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
  for( size_t i = 0; i < lines.size(); i++ )
  {
    Vec4i l = lines[i];
    line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
  }
 #endif
 imshow("source", src);
 imshow("detected lines", cdst);
 
 waitKey();
 
 return 0;
}
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
29.10.2015, 12:59     Как найти расстояние между 2 линиями (OpenCV)? #8
Цитата Сообщение от MValeriy Посмотреть сообщение
как получить координаты точек, и как собственно вычислить потом расстояние между ними?
у тебя каждая линия задана структурой
Код
Vec4i l = lines[i];
где l[0],l[1] - координаты первой точки, l[2],l[3] - координаты второй точки. расстояние между линиями - понятие растяжимое, так что я предлагаю тебе взять среднее между коорданатами по Х и Y первой точки, то же самое со второй точкой. получишь 2 точки, которые будут серединами линий. расстояние между полученными точками считай по формуле Евклида: https://ru.wikipedia.org/wiki/%D0%95...B8%D0%BA%D0%B0
MValeriy
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 28
02.11.2015, 12:40  [ТС]     Как найти расстояние между 2 линиями (OpenCV)? #9
Цитата Сообщение от OstapBender Посмотреть сообщение
предлагаю тебе взять среднее между коорданатами по Х и Y первой точки
сидел я тут пытался разобраться:
среднее между координатами по X и Y записал я вот так:
C++
1
2
     pt3.x = (pt1.x+pt2.x)/2;
     pt3.y= (pt1.y+pt2.y)/2;
тоесть таким образом находим середину первой линии(точку pt3(x,y)).

раньше было:
C++
1
2
3
4
5
     pt1.x = cvRound(x0 + 1000*(-b));
     pt1.y = cvRound(y0 + 1000*(a));
     pt2.x = cvRound(x0 - 1000*(-b));
     pt2.y = cvRound(y0 - 1000*(a));
     line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
тоесть была проведена линия с точки pt1 (x,y) до pt2(x,y).

как мне сделать что бы теперь линия была проведена между серединами ?(тобишь между средними точками)
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.11.2015, 00:01     Как найти расстояние между 2 линиями (OpenCV)? #10
Цитата Сообщение от MValeriy Посмотреть сообщение
тоесть таким образом находим середину первой линии(точку pt3(x,y)).
ну таким же образом найди середину второй линии... ?!?!?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2015, 10:41     Как найти расстояние между 2 линиями (OpenCV)?
Еще ссылки по теме:

Найти минимальное расстояние между вершинами 1 и N графа C++
C++ Найти расстояние между символами с1 и с2
Найти расстояние между двумя гексагональными ячейками C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MValeriy
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 28
03.11.2015, 10:41  [ТС]     Как найти расстояние между 2 линиями (OpenCV)? #11
Цитата Сообщение от OstapBender Посмотреть сообщение
ну таким же образом найди середину второй линии... ?!?!?
к сожалению я не знаю как прописать это в с++

Добавлено через 23 секунды
тем не меннее спасибо за помощь
Yandex
Объявления
03.11.2015, 10:41     Как найти расстояние между 2 линиями (OpenCV)?
Ответ Создать тему
Опции темы

Текущее время: 16:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru