在轮廓OPENCV中绘制最长线

时间:2016-06-20 12:48:06

标签: python image python-2.7 opencv opencv3.0

我正在使用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]

1 个答案:

答案 0 :(得分:0)

以下方法用于从图像中绘制行数并得到最大值的程度试试这个。工作正常

 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;

}