AI_DL_Assignment / 5. OpenCV Tutorial - Learn Classic Computer Vision & Face Detection (OPTIONAL) /30. Line Detection - Detect Straight Lines E.g. The Lines On A Sudoku Game.srt
Prince-1's picture
Add files using upload-large-folder tool
17e2002 verified
0
1
00:00:00,890 --> 00:00:06,370
So let's talk a bit about line detection. Line detection is a very important completive vision method.
1
2
00:00:06,680 --> 00:00:12,770
And you can imagine it being used in applications such as lane detection for self-driving cars or perhaps
2
3
00:00:12,770 --> 00:00:16,680
for something that actually detects lines on a chessboard like this example here.
3
4
00:00:17,330 --> 00:00:24,770
So the two algorithms that are available in OpenCV are Hough lines and probabilistic Hough lines.
4
5
00:00:24,770 --> 00:00:28,280
Now there are some differences between them which illustrate when we run the code.
5
6
00:00:28,430 --> 00:00:32,660
But for now let's talk about how Hough lines represents lines quickly.
6
7
00:00:32,750 --> 00:00:37,310
I won't go into too much detail with the Math but you may have remembered this from high school mathematics
7
8
00:00:37,700 --> 00:00:43,550
that you can read up represent a straight line by this equation y = mx+c, M being a gradient
8
9
00:00:43,550 --> 00:00:46,430
or slope of two lane and C being the y intercept.
9
10
00:00:46,850 --> 00:00:50,510
However in Hough lines we represent lines a little bit differently.
10
11
00:00:50,600 --> 00:00:53,660
So remember OpenCV uses here as this reference point.
11
12
00:00:53,660 --> 00:00:54,850
Top left corner.
12
13
00:00:55,220 --> 00:01:01,310
So what we do here in this representation we have P which is the perpendicular distance of the lane from
13
14
00:01:01,310 --> 00:01:01,990
the origin.
14
15
00:01:02,120 --> 00:01:09,110
In this case it's pixel's and theta being the angle of this line here, the normal of the lane meeting
15
16
00:01:09,110 --> 00:01:14,900
this origin point here and theta is measured in radians in OpenCV
16
17
00:01:14,910 --> 00:01:22,070
So if you actually do open this theta value in openCV or access it you'll see it's in radians.
17
18
00:01:22,100 --> 00:01:26,900
So these are some details here that I won't go into until we reach into the code but this is basically
18
19
00:01:26,910 --> 00:01:32,300
the cv2 Hough Lines function and cv2 to Probabilistc Hough Lines function
19
20
00:01:32,300 --> 00:01:35,410
So let's actually use these methods now in our code.
20
21
00:01:37,430 --> 00:01:37,810
OK.
21
22
00:01:37,870 --> 00:01:43,920
So let's open our line detection code here and select 4.6 OK.
22
23
00:01:43,930 --> 00:01:44,890
So here we go.
23
24
00:01:45,200 --> 00:01:48,580
So firstly let's run this could give you an idea what's going on.
24
25
00:01:49,040 --> 00:01:52,620
So this was a blank Soduko board here where we had lines here.
25
26
00:01:52,670 --> 00:01:56,000
So as we can see we've actually identified all the major lines here.
26
27
00:01:56,000 --> 00:02:00,920
However we've actually left with one line here surprisingly and we've identified multiple lanes in a
27
28
00:02:00,920 --> 00:02:01,750
few locations.
28
29
00:02:01,760 --> 00:02:04,610
You can see there's maybe two lines here two lines here.
29
30
00:02:04,610 --> 00:02:06,320
This one looks like three cause there's.
30
31
00:02:06,430 --> 00:02:07,450
A thicker point (line) here.
31
32
00:02:08,060 --> 00:02:10,420
So you can see it's not perfect.
32
33
00:02:10,420 --> 00:02:13,440
And what researchers do, let's bring it up again.
33
34
00:02:13,570 --> 00:02:15,430
They sometimes merge these lines together.
34
35
00:02:15,520 --> 00:02:19,130
You find the average of the tree closest points and merge them together.
35
36
00:02:19,700 --> 00:02:23,110
So let's see it take a look and see what's going on here.
36
37
00:02:23,420 --> 00:02:29,240
So similarly in the findcontours function we've grey scaled our image we found canny edges because canny edges
37
38
00:02:29,240 --> 00:02:35,800
helps quite a bit especially in off lane transforms not transform sorry as HOV lanes.
38
39
00:02:36,020 --> 00:02:37,580
And these are the parameters here.
39
40
00:02:37,700 --> 00:02:43,730
So these parameters here in this Hough lines function takes it, it takes the input image here and then we
40
41
00:02:43,730 --> 00:02:45,450
set some accuracy parameters here.
41
42
00:02:45,590 --> 00:02:48,910
So the first parameter we set rho or P value here.
42
43
00:02:48,980 --> 00:02:53,180
We typically said this that one pixel but you can experiment with larger values if you wish.
43
44
00:02:53,180 --> 00:02:59,650
And then we said the theta accuracy a pie over 180 using numpy dot pie or np.pie to generate our pie value
44
45
00:02:59,660 --> 00:03:02,110
and then this Value here
45
46
00:03:02,180 --> 00:03:03,460
This here is a key parameter.
46
47
00:03:03,470 --> 00:03:06,130
This is a threshold for determining if something is a line.
47
48
00:03:06,410 --> 00:03:12,590
So if we set this at a lower value let's say at 150 we should get a lot more lines, way too much lines
48
49
00:03:12,590 --> 00:03:13,160
here!
49
50
00:03:13,610 --> 00:03:16,930
And if we said this at a higher value let's say 300
50
51
00:03:17,570 --> 00:03:19,950
We get only some few lines.
51
52
00:03:19,970 --> 00:03:23,870
So 240 was a good parameter to use for this.
52
53
00:03:23,870 --> 00:03:29,510
We only miss, actually we missed two lines here miscounted this one here and that's the first part of
53
54
00:03:29,510 --> 00:03:31,630
the function there.
54
55
00:03:31,650 --> 00:03:34,080
So the next part of the code looks a bit confusing.
55
56
00:03:34,320 --> 00:03:40,440
But what's important to remember here is that cv2.HoughLines generates this object here, lines and lines
56
57
00:03:40,440 --> 00:03:44,040
has rho and theta values inside of it.
57
58
00:03:44,040 --> 00:03:48,750
So what's going on here is that we're actually looping through all the values inside of lines here and
58
59
00:03:48,750 --> 00:03:52,450
converting it into a format where we can actually get the endpoints of lines.
59
60
00:03:52,610 --> 00:03:58,260
That's what we use to do that line which we went through in section 2 I believe and we just plot all
60
61
00:03:58,260 --> 00:04:03,130
the lines that this cv2.HoughLines function generates.
61
62
00:04:03,140 --> 00:04:07,090
So now let's take a look at probabilistic Hough Lines which is a little bit different.
62
63
00:04:07,100 --> 00:04:10,910
And actually the code looks a lot shorter and that's mainly because we don't need to convert it into
63
64
00:04:11,030 --> 00:04:16,060
a format the line format into into something that cv2.line can use.
64
65
00:04:16,190 --> 00:04:22,190
It actually generates a start and end points of the lines automatically here and also has similar parameters
65
66
00:04:22,190 --> 00:04:27,770
here where we have pixel accuracy theta accuracy but it also has some new thresholds here.
66
67
00:04:27,770 --> 00:04:33,200
There's a minimum line length and a maximum line gap as well as the threshold value.
67
68
00:04:33,590 --> 00:04:37,250
And similarly we do have grayscale and use Canny Edges again
68
69
00:04:37,340 --> 00:04:42,190
So now let's run the probabilistic hough lines function which exists right here.
69
70
00:04:44,080 --> 00:04:53,600
And it looks a lot different you actually see what looks like small lines like worms almost on image
70
71
00:04:54,290 --> 00:04:58,070
and we can actually play with parameters to actually get straight lines if you want.
71
72
00:04:58,280 --> 00:05:04,360
But atually let's bring that up one more time what's key to note here is that because of these new parameters
72
73
00:05:04,400 --> 00:05:08,700
we have maximum length gaps maximum lane gaps actually eliminate the need.
73
74
00:05:08,810 --> 00:05:13,460
Well the problem where we have multiple lanes drawn over each other in the same lane here.
74
75
00:05:13,670 --> 00:05:18,770
If we set a maximum lane gap and see five or 10 there's no there's not going to be any lanes running
75
76
00:05:18,770 --> 00:05:26,720
over the existing line that are similar as well as we have a minimum length of five for lanes five pixels is
76
77
00:05:26,720 --> 00:05:27,620
quite small.
77
78
00:05:27,620 --> 00:05:31,330
But generally we can start with that if you want to get many lines here.
78
79
00:05:31,590 --> 00:05:33,860
Lines and a character perhaps.
79
80
00:05:33,920 --> 00:05:39,820
And let's actually play with the threshold value and see what happens now.
80
81
00:05:39,850 --> 00:05:42,560
So let's set this 50.
81
82
00:05:42,680 --> 00:05:43,130
There we go.
82
83
00:05:43,170 --> 00:05:44,880
I'm seeing slightly more lines here.
83
84
00:05:44,900 --> 00:05:46,190
It looks generally similar.
84
85
00:05:46,290 --> 00:05:51,920
So let's actually set this 10 actually less line sorry.
85
86
00:05:51,930 --> 00:05:57,640
So maybe we need to set this at a higher value.
86
87
00:05:58,070 --> 00:06:01,100
So that gives you a feel of these parameters here.
87
88
00:06:01,100 --> 00:06:05,220
Hopefully you would you would probably find whichever one more useful.
88
89
00:06:05,830 --> 00:06:07,880
Generally I tend to use Houghlines more.
89
90
00:06:08,110 --> 00:06:10,860
But they are definitely use cases for probabilistic.
90
91
00:06:11,170 --> 00:06:15,310
And if you'd like to learn more about probabilistic hough lines I've actually put a link at the bottom
91
92
00:06:15,310 --> 00:06:15,800
here.
92
93
00:06:16,060 --> 00:06:20,980
This is a link to the research paper where probabilistic Hough Lines with first proposed.
93
94
00:06:20,980 --> 00:06:23,600
So hope you enjoyed this lesson on line detection.
94
95
00:06:23,710 --> 00:06:24,190
Thanks.