2015-02-08 2 views
0

Я использую findContours в Opencv 2.9 (C++). То, что я получаю, является контуром вектора>, который описывает мои контуры. Допустим, у меня есть прямоугольник с контуром, сохраненным в векторе. То, что я хотел бы сделать дальше, - соединить левую и правую стороны контура в любой точке с линией. Например. 10 пикселей ниже верхнего левого угла до 10 пикселей ниже верхнего правого угла прямоугольника. Линия должна заканчиваться там, где выполняется контур. Есть ли лучший подход, а затем просто идет по линии сканирования по этой полосе и проверяет каждый пиксель, если верно pointPolygonTest?Как подключить контуры OpenCV горизонтально?

Заранее благодарен!

ответ

1

Предположим, у вас есть углы (вверху слева, сверху справа, внизу справа и внизу слева), тогда вы можете легко вычислить пересечения между двумя строками, каждая из которых определяется двумя точками.

Например, линии (Р1, Р4) пересекается с линии (R1, R2), и точка пересечения я:

enter image description here

Вот фрагмент кода для вычисления точка пересечения, если линии пересекаются:

// Finds the intersection of two lines, or returns false. 
// The lines are defined by (o1, p1) and (o2, p2). 
bool intersection(cv::Point2f o1, cv::Point2f p1, cv::Point2f o2, cv::Point2f p2, cv::Point2f &r) 
{ 
    cv::Point2f x = o2 - o1; 
    cv::Point2f d1 = p1 - o1; 
    cv::Point2f d2 = p2 - o2; 

    float cross = d1.x*d2.y - d1.y*d2.x; 
    if (std::abs(cross) < /*EPS*/1e-8) 
     return false; 

    double t1 = (x.x * d2.y - x.y * d2.x)/cross; 
    r = o1 + d1 * t1; 
    return true; 
} 
Смежные вопросы