Нарисуйте самую длинную линию в контурах OPENCV

Я использую OpenCV и Python. Я пытаюсь нарисовать самую длинную линию внутри контуров.

У меня есть контур по имениcnt, Изображение двоичное, внутренняя часть контуров белая, а внешняя черная. Я хотел бы нарисовать самую длинную линию внутри белых контуров. Я нашел, как рисовать линии, используяcv2.lines но я не нашел, как нарисовать самый длинный. Есть ли у вас какие-либо идеи?

img_copy = cv2.dilate(copy.deepcopy(img), np.ones((2,2),np.uint8),iterations = 2)
contours, hierarchy = cv2.findContours(copy.deepcopy(img_copy),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
areas = [cv2.contourArea(c) for c in contours]
max_index = np.argmax(areas)
cnt = contours[max_index]
 Hazel20 июн. 2016 г., 15:50
Это не зависит от изображения, я буду искать способ найти все прямые линии в контуре, затем выберу самую длинную.
 HariKrishnan.P08 июл. 2016 г., 12:08
попробуйте HoughLines algorthim, чтобы найти его.
 Balaji R20 июн. 2016 г., 15:34
Пожалуйста, добавьте несколько примеров изображений с желаемым результатом!

Ответы на вопрос(1)

чтобы нарисовать количество строк на изображении и получить степень максимального значения, попробуйте это. его работает нормально

 Mat Compute_skewAngle (Mat& src,Mat& src_gray,int drawLine) {

int thresh = 100;
RNG rng(12345);


// 1. Load Gray Scae Image
// 2. Get Size of Image
cv::Size size = src_gray.size();
// 3. blur the Grayscale image
cv::blur(src_gray, src_gray, cv::Size(3,3) );



cv::Mat threshold_output;
std::vector<std::vector<cv::Point> > contours;
std::vector<Vec4i> hierarchy;


// 4. Detect edges using Threshold / Canny edge Detector
//cv::threshold( src_gray, threshold_output, thresh, 255, THRESH_BINARY );
Mat dst, cdst;
cv::Canny(src_gray, dst, thresh, 200, 3);

// 5. Gray Image to BGR
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;

double angle = 0.;
int countNegative = 0;
int countPositive =0;

HoughLinesP(dst, lines, 1, CV_PI/180, 100, 10, 100);

NSMutableDictionary *angleCountDict = [[NSMutableDictionary alloc] init];

for( size_t i = 0; i < lines.size(); i++ )
{
    if(drawLine == 1) {  // draw line while pass flag value 1
        Vec4i l = lines[i];
        line( cdst, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
    }


    double delta_y = lines[i][3] - lines[i][1];
    double delta_x = lines[i][2] - lines[i][0];
    double currentAngle =atan2(delta_y,delta_x);
    int angleAsDeg = abs(currentAngle * 180 / CV_PI);


    NSString *_retValue = [angleCountDict objectForKey:[NSString stringWithFormat:@"%d", angleAsDeg]];
    int angleCount = [_retValue intValue];
    [angleCountDict setObject:[NSNumber numberWithInt:angleCount + 1] forKey:[NSString stringWithFormat:@"%d", angleAsDeg]];

    double slope  =  delta_y / delta_x ;  // find the slope to detect the angle " - " or " + "
    if(slope < 0)
        countNegative ++;
    else
        countPositive ++;
}

#endif

// sort the dictionary to get the largest value of degree count
NSArray *blockSortedKeys = [angleCountDict keysSortedByValueUsingComparator: ^(id obj1, id obj2) {
    return [obj2 compare:obj1];
}];


NSString *degreeVal;
if([blockSortedKeys count] > 0)
    degreeVal = [blockSortedKeys objectAtIndex:0];


angle = [degreeVal doubleValue];

if(countNegative > countPositive) {
    angle = - angle;
}
Mat outPut;
outPut = rotateMatImage(src,angle,cdst);

return outPut;

}

Ваш ответ на вопрос