Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to draw line not line segment OpenCV 2.4.2

Tags:

opencv

Well the question says it all,

I know the function Line(), which draws line segment between two points.

I need to draw line NOT a line segment, also using the two points of the line segment.


[EN: Edit from what was previously posted as an answer for the question]

I used your solution and it performed good results in horizontal lines, but I still got problems in vertical lines.

For example, follows below an example using the points [306,411] and [304,8] (purple) and the draw line (red), on a image with 600x600 pixels. Do you have some tip?

enter image description here

like image 232
Zaher Joukhadar Avatar asked Oct 31 '12 14:10

Zaher Joukhadar


People also ask

How do you draw multiple lines in OpenCV?

cv. polylines() can be used to draw multiple lines. Just create a list of all the lines you want to draw and pass it to the function. All lines will be drawn individually.

How do you draw a polygon in OpenCV?

Step 1: Import cv2 and numpy. Step 2: Define the endpoints. Step 3: Define the image using zeros. Step 4: Draw the polygon using the fillpoly() function.


2 Answers

I see this is pretty much old question. I had exactly the same problem and I used this simple code:

double Slope(int x0, int y0, int x1, int y1){
     return (double)(y1-y0)/(x1-x0);
}

void fullLine(cv::Mat *img, cv::Point a, cv::Point b, cv::Scalar color){
     double slope = Slope(a.x, a.y, b.x, b.y);

     Point p(0,0), q(img->cols,img->rows);

     p.y = -(a.x - p.x) * slope + a.y;
     q.y = -(b.x - q.x) * slope + b.y;

     line(*img,p,q,color,1,8,0);
}

First I calculate a slope of the line segment and then I "extend" the line segment into image's borders. I calculate new points of the line which lies in x = 0 and x = image.width. The point itself can be outside the Image, which is a kind of nasty trick, but the solution is very simple.

like image 197
pajus_cz Avatar answered Sep 28 '22 10:09

pajus_cz


You will need to write a function to do that for yourself. I suggest you put your line in ax+by+c=0 form and then intersect it with the 4 edges of your image. Remember if you have a line in the form [a b c] finding its intersection with another line is simply the cross product of the two. The edges of your image would be

top_horizontal =    [0 1 0];
left_vertical   =   [1 0 0];
bottom_horizontal = [0 1 -image.rows];
right_vertical =    [1 0 -image.cols];

Also, if you know something about the distance between your points you could also just pick points very far along the line in each direction, I don't think the points handed to Line() need to be on the image.

like image 39
Hammer Avatar answered Sep 28 '22 12:09

Hammer