2010-05-01 75 views
7

Tôi đang sử dụng OpenCV để phù hợp với một dòng từ một tập hợp các điểm sử dụng cvFitLine()Vẽ đường lắp (OpenCV)

cvFitLine() trả về một vector bình thường đó là đồng tuyến tính vào dòng và một điểm trên đường dây. Xem chi tiết here

Sử dụng thông tin này làm cách nào tôi có thể lấy phương trình của một đường để tôi có thể vẽ đường?

Trả lời

7

Nếu cvFitLine() lợi nhuận bình thường vector (vx,vy) và điểm (x0,y0), sau đó phương trình của dòng là

(x, y) = (x0, y0) + t * (vx, vy)

nơi t chạy từ − ∞ đến + ∞.

Đây là những gì bạn đã yêu cầu, nhưng có lẽ không hữu ích khi vẽ đường kẻ. Bạn sẽ muốn clip nó vào ranh giới màn hình, hoặc có lẽ là hộp giới hạn của tập hợp các điểm ban đầu. Để cắt một đường thẳng thành hình chữ nhật, chỉ cần giải các giá trị của t nơi đường thẳng đi qua ranh giới của hình chữ nhật.

9

Chỉ cần vẽ một đường lớn thay vì giải quyết các ranh giới. ví dụ:

cv.Line(img, (x0-m*vx[0], y0-m*vy[0]), (x0+m*vx[0], y0+m*vy[0]), (0,0,0)) 

sẽ làm điều đó ví dụ .. cho m đủ lớn :)

4

tôi đã sử dụng một chiến lược tương tự như Karpathy ra ở đó nhưng sử dụng một chức năng phụ. Như bạn có thể thấy, tôi đang sử dụng cvClipLine để cắt đường thẳng thành kích thước của hình ảnh, điều này là không cần thiết nhưng lại thêm một chút độc đáo.

Ngoài ra hệ số ở đây được định nghĩa làMult = max (img-> height, img-> width) vì vậy chúng tôi không nhận được số có thể tràn vào một ngày hoặc một thứ gì đó.

void drawLine(IplImage * img, float line[4], int thickness,CvScalar color) 
{ 
    double theMult = max(img->height,img->width); 
    // calculate start point 
    CvPoint startPoint; 
    startPoint.x = line[2]- theMult*line[0];// x0 
    startPoint.y = line[3] - theMult*line[1];// y0 
    // calculate end point 
    CvPoint endPoint; 
    endPoint.x = line[2]+ theMult*line[0];//x[1] 
    endPoint.y = line[3] + theMult*line[1];//y[1] 

    // draw overlay of bottom lines on image 
    cvClipLine(cvGetSize(img), &startPoint, &endPoint); 
    cvLine(img, startPoint, endPoint, color, thickness, 8, 0); 
} 
0

chúng tôi sử dụng "Vec4f fitedLine;" cho được trang bị dòng trong fitLine chúng tôi có 4 thông số nếu chúng ta xem xét mối quan hệ dòng az dưới đây: Y - Y0 = M (X - X0)

chúng tôi có Y0 = FitedLine [3]; X0 = FitedLine [2]; m = FitedLine [1]/FitedLine [0];

vì vậy chúng tôi có phương trình Đường, chúng tôi có thể tìm các điểm khác trên đó.

Các vấn đề liên quan