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
| 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. | |