Basket Ball Shot Predictor using OpenCV Python | Computer Vision

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hey everyone welcome to my channel today we are going to create a basket short predictor so as you can see here these are the dots the green dots are the ones that the ball has been detected at these are the different positions and the purple line is the curve that we have generated through these green points that is predicting where the ball will land so right now you can see it predicts that it will hit right at the corner of the basket so because it is at the corner of the basket it is saying that there will be no basket so it will not happen so what we can do is we can press the s button and it will continue and there you go so as you can see as it predicted it will not go in and it did not go in so if we look at the second video let's go ahead and try that out so it will start and it will predict it will stop and now using these 10 points it has predicted this curve and then if we press the s button again you can see how accurate the prediction was that it will land outside the basket so let's try the next one and there you go so now you can see the prediction is that it will land in the basket because the curve is telling us it goes right through the basket so as you can see here it's green and if we click on s and there you go so basically what we are using is polynomial regression if you are not familiar with it we are going to go through step by step how it works and i will explain a little bit of maths as well the equation that is required and as you can see it is quite accurate if you look at the path it actually exactly follows that pattern so it is a quadratic equation that we are using at the back end so all of this will be shared how exactly you can use python to do this and we will be using our own packages the cv zone package and the opencv package to actually run this and it will be quite a lot of fun and if you would like to level up your computer vision skills do check out our premium courses that are available on our website so if you really want to level up your skills that is the way to go and they are on sale right now so go ahead and check them out and for today let's go ahead and start up with this tutorial so here we are in our python project and as you can see we have named it basketball predictor so the first thing we will do we will go to file settings and we are going to install all the packages so here there is no interpreter yet so we need to click on the settings add and then we already have an existing environment so we will add that so that should be it and then we need the cv zone package so we will write cv zone and we are going to hit install now this will pretty much install all the packages that we need we need uh opencv we need numpy and we also need math but math is already installed so we will be using a little bit of maths i will explain what exactly are we using and how do you uh come across these equations so we will not go into a lot of details but we will scratch the surface to understand the underlining principle of the concept so here cv zone is done and what we will do now we are going to go ahead and create a new file and we can just call it main.pi so main is there and then we will just write our code in there so the first thing we have to do is we have to import cv2 and then we need to import import cv zone so these are the two packages that we will be needing and later on i will keep mentioning what exactly are the other packages that we need but for now what we do need are the videos the videos that we are going to use to test all of this so these videos and the image itself will be available on our website so you can download it from there so all you have to do is sign up and then you can download it for free so we are going to paste it here so this is the folder that will be available in the zip file and then we will also have ball.png so i will tell you why do we have these videos and why do we have the ball so this is an image taken out from one of these videos so we are going to use that and if you go into the videos then we have a total of seven videos that you can test on but we will start with number one and then later on we will keep adding so now that we have all these things we are going to start with our webcam so we will write cap and here we are going to write cv2 dot video capture so video capture and here normally we give the webcam number but right now we are going to give in the uh what do you call the video number so here it is available in the videos so we are going to write videos why is it not showing automatically anyway so videos and then we will write vid then there is a space don't forget the space and then we will write one and we will close the bracket so dot mp4 so this is our first video that we are using here later on we will change you can also automatically change these videos but for now i think that should be more than enough then we are going to write while true and we are going to read so we will write success and image is equals to cap dot read and then we are going to write cv2 dot im show and we will write show and then inside we can write uh image let's say and then we are going to write img so we are going to display that and then cv2 dot wait key so the delay will be one second um one millisecond but the problem here is that one millisecond is actually not enough so because these videos are fast and we won't be able to see the ball going all the way but we are going to fix that later on so let's go ahead and run this and see if it works right click and run and there you go so now you can see we have two problems the first one is that it's too fast and the second one is that it's too big it's not really fitting on the screen so right before we output the image we are going to resize it so we are going to write image is equals to cv2 dot resize and for resize we can given the exact numbers but we are not going to do that so we will put it as 0 0 and then we will write none as the output and then we are going to given the scale so let's say 0.7 i think should be fine and 0.7 so let's try that out um yeah i think that should be enough and then also we are going to decrease the speed the frame rate so here it is one let's put 10. still it is fast to be honest we can put 50 let's say yeah see uh the the algorithm will work either way if you put it as fast or slow but we are putting it as slow so that we can observe what exactly is happening otherwise uh it's a little bit difficult to know what exactly is happening okay that is good what should we do next okay so the next step is to find the color of our ball so this is why we have this image called ball.png so that we can use this image and from this image we are going to take the the ball the color of the ball and then we can apply it on our video so because the video just keeps shutting down very quickly so it's very annoying that's why we are doing this okay so how can we do this what we can do is instead of writing the image here uh instead we can write cv2 dot im read and we want to read in the ball dot png so this is our image so i will write here image is equals to this and that will be our image instead of this so we have commented this out so that later on when we want to try it with the video we can simply use this so there you go so this is our image that we are getting that's good now uh what we will do is uh first of all we are going to crop the lower region so this region we don't really need and the color here and the color here are not exactly similar but they have some similarities so this is orange this is brownish but still it might interfere so we can just cut this part off because we don't really need it so how can we do that we can do that by simply writing it so this is the output part so let's just put some comments here or let's just write it down this is the last part where we display this play display and then we have the initial part where we are grabbing the image so grab the image so this is grabbing the image and this is the display and in between will be the complete process so here we are writing image ball png and then what we want to do is we want to crop so you can call it image crop or because we are going to use it as the main image we can just write image is equals to cb uh not cv2 because it is a matrix so it's we can just tell it use these numbers from x to y and it should be fine so we can write here image and then uh for the for the y axis we have to give in certain values so let's say from 0 to what is the total height uh one zero eight zero so let's say 900 and then we will have all the rest for the width we are not cropping the width we are only cropping the height so that is what we are saying here so let's run that and there you go so now you can see it has been cropped uh you can crop even further you can crop from the top as well but for the top you know the bowl is traveling so it's not really good if you crop that part so we will keep the top so now uh this is the image that is ready for the processing so here we are going to write color or let's say find the color color ball or something like that so what we can do is we can use the cv zone package to find the color normally you would use uh the opencv package but with opencv you have to write a few lines of code cv zone is again using the same principle of opencv but you have to write a few a few lines of code not a lot so i believe in one or two lines you can detect the color so we are going to say from cv zone cv zone dot color module import color finder and then we are going to declare our color finder here we can comment this as uh um or initialize initial li niche [Music] lies the video or let's say yeah video and over here we are going to say uh create the color finder object so we can we can call it my color finder finder and then we will put it equals to uh color finder and inside that color finder we have the option of giving true or false so if we put false then there is no debug mode and we are running the actual code but if you write true then this means we are running the debug mode where we are trying to find the color uh where we are trying to find the color with the track bar values i will explain this further when we run it so we will put this as true and here we are going to write that our my color finder dots get color hsv and then we are going to give in our image and then we are going to give in our color so here we are have to give in an hsv color so right now we don't have that so we can just write hsv values let's say and once we have that then we can try out uh these values but right now we are going to comment it so let's run this and there you go but it is not giving us anything no we need to do one thing we need to return it uh we need to give it some hsp values let me copy some random values here so we will give in some random values so you have to write it like this h minimum s minimum or the easier way i'll tell you just write in here red red for now later on i will tell you how to change it so we will write it here and then uh it will return us two things the first thing it will return is the image color and the second thing it will return is the mask so we are going to display the image color so we can have a look at that look at that here so image color and we can write here color as well so let's run that uh two positional arguments but we're given three uh okay i think for the color i can't remember the exact um my color finder dot update okay my bad so here you have to write not get you have to write update okay there you go so our colored image is not actually smaller because we didn't resize it but it's okay so what we can do is we can use these track bars so right now it's in debugging mode so we will use these track bars to actually find the color that we desire and later on we can run it uh continuously so what we are trying to aim here is to keep the color that we want and everything else should be black so right about here yeah something like that so i think it's this should be fine um this we can consider this as noise so that should be fine so then you can press stop and if you go to the console you can see that you have these hsv values so you can copy this this will be a dictionary and you can simply paste it in this there you go so once you paste that then you will change the true to false and now it will try to find the ball continuously so let's run that so we can remove the image color and or should we put the image no we need the image color um [Music] okay let's just show the image color as well and let's forget about the image for now so we will remove this and image color we are going to put here and here so we are basically resizing the image color so it's a little bit easier to see there you go so now it is detecting that color by default and what we have to do now is to change this to the video so we can comment this out we will keep it late for later on if we need it and if we run that there you go now you can see the ball has been tracked and if you want to see the mask you can do that too so here you can put the mask in and there you go so this is the mask so this is the one this is the image that we are going to use uh to find the contour to find the location of this ball using contours and based on that we are going to put the location uh that we are getting so the the arc that we get will be based on this location so what do we do now uh we can we can display the image color that's fine and actually we will display the actual image later on but for now what we need is to find the contours so here we will write find location of the ball so this is the main thing that we need now so what we will do is we will use cv zone cv zone dot find contours we will give in the image the original image and or should we make a copy of that we can make a copy later on then we have to give in the mask so we will write here mask then we have to given the minimum area so the minimum area is basically to remove the noise so we can put like 200 pixels it should have at least 200 pixel to detect it as a ball and the rest um we can pretty much keep the same so let's see if we get something so in return what it will give you it will give you the image contours so we will write here image contours and then we will write here contours so these are the two things that it will return so yeah why would this is there a spelling mistake contours there you go so yeah so now we can display the image contours instead so if we run this there you go so now you can see we are getting two contours one is here and the other one is here so maybe we need to tweak a little bit so that we don't get these values um if we increase this a little bit um or it's hard to do it this way let's just go back a little bit and we will display the image color and we will put this as true now we are trying to find the the correct color again so that's why we are doing this so let's try that okay i think this is good maybe a little bit less there you go i think yeah okay let's try that again let's copy this and paste it here and we are going to hide this and this is already on and this should be false yeah so let's open up the image contours let's see how that looks like and there you go so now this part is not that visible so anyways what we will do is we will take on the biggest contour that we are finding and we can even increase this to maybe 500. yeah no it's better anyways so what we are going to do uh now that we have the color and the position of the ball we are going to display its points by point so every frame it knows its location we are going to put a circle there so how can we do that the first thing we are going to do we are going to write here if there is something present in the contours then take the biggest contour how can we take the biggest contour you just use the zero value that's it the first one is the biggest one it is already sorted if you go to find contours the sorting is true it means the biggest one will be the first one so you can write here contours zero and then what do we need we need the center of it so it basically it has a dictionary through which we can get the center point and we are going to store this in uh let's say cx and cy so then we can simply print it out cx and cy so we want to see what it looks like before we go any further or we can uh we can we can put it as a circle so cv2 dot circle and we will put it on image which one are we using at the end image contours okay let's do one thing because this will get confusing uh we will put one image as the image result so we will put everything on that image so we can declare it as a new image or we can say that our image contours is the final image that we are going to display so we will display everything on it so here even we are going to resize our image contours so we will say it like that and then here we are going to display on the image contours so what exactly are the center points it will be cx and cy so these are our center points and the radius you can put anything let's say 10 that might be too much let's say five uh then the color let's put it as 0 uh 255 and zero that will be green and the thickness is cv2 dot filled so let's run that and there you go so now you can see you can you are getting the points you are getting the center point but it is not really displaying for all the frames it's just displaying for the current frame so how can we display it for all the frames because every frame there is a new image coming from the webcam or from the video feed so you have to display on every single frame so what we can do is we can put the cx and cy values in a list and then we can access that list and display all of them at once so here we are going to declare some variables we will call it variables and we will call this as position list is equals to empty and then here we are going to write uh position list dot append and we want to append this to our position list and what we will do is we are going to loop through outside it outside the circle or should be inside it should be outside so let's just put it outside if it doesn't work we'll come back to that okay so we will say that um for position in position list we want to print out the positions so we will write here position so that will draw all the circles so let's run that there you go so you can see this is the green dots let's run that again there you go the green dots now the green dots are good but sometimes you want to see it as a line so what you can do is you can create a line that will connect this point to the one from the previous point yeah so what we can do is we can write cv2 dot line and we will put it on our image contours and then you have to give in the original location which is position and then you have to given the location of the previous point so position now we cannot access the one before it because we don't know which one it is so we need to know the count so we can write here enumerate and we will put a bracket here and then uh here we can write let's say i so this is the count how many counts uh how many times it has iterated so we can say position list at the current i minus one so the previous one so it will draw a line uh between those and what else the color let's change the color let's keep it same zero and then we'll put two five five and zero and the thickness is let's say 2. now the problem here is that when the position is 0 when the iteration is 0 then this will give an error because there is no previous location previous position so we need to give in that statement that if i is equals to 0 then we will copy this and we will draw a line from position to position so it's like a dot so or you can ignore it's up to you else do this so yeah so let's run that and there you go we get a perfect line going all the way let's run that again actually still i feel like it's a little too fast let's put it at 100 so we can slowly see what is happening there boom and boom looks good looks quite fancy so now that we have this actually we didn't try it out with the others so let's go ahead and try it out with number two yeah that's good then let's try with number three there you go let's try with four i think this one goes in yeah the fourth one remember that the fourth one actually goes in so we will check that later as well let's try the fifth one and yeah so that is good so now we have our color we have our contour we have the dots we have the line and what else what else do you need so what we need next is now that we have these points we need to estimate the points that will come later on so for example we have the first let's say 10 points and based on these 10 points we need to estimate where it will land whether it will be in the basket or not so that's the basic idea so how can we do that so we can do that by something known as polynomial regression so what is that let's have a look so i have googled here polynomial regression so basically when you have some points and you want a best fit line then you use a linear equation so that linear equation is y is equals to b naught plus b 1 x so you can say this this is coefficient a this is coefficient b so you use that when you need a linear relationship but here you can see it is not linear and this is the kind of curve that we have it's in the opposite direction but still the concept is the same so we have these points and we need to give a best fit curve so that best fit curve is going to come with a polynomial equation a quadratic equation not a linear equation so we need to find the polynomial equation or the quadratic equation that fits this these points so we have a first few points we will fit the curve and that curve will give us the prediction of what will happen in the next 10 frames or next 20 frames or whatever so this is the equation that we need so if we write it down here so let me write it down here so we will talk about polynomial regression so the idea is that you have the equation y is equals to a x to the power of 2 plus b x oh small x plus c so this is your equation and what you can do is if you find the value of a b and c then for any given x you can find the value of y let's say the value of y will determine whether the ball will go in or not so based on that we can find the x or the y whatever we want given that we have the other one we can find this so given these points we need to find a b and c so how can we do that we can do that from numpy so we will import numpy as np and using numpy we are going to fit based on these points so here we will first check that if we have something in the contours or should we check we should check if there is something in this list because we are relying on this list to find the curve so we should check if there is something in this list then we do the polynomial regression so if position list then actually this also should be done only when there is what you call some points in the list so we will do polynomial regression here first of all we need to find the coffee shens spellings definitely are wrong there you go coefficients there's an e okay so then uh to find the coefficients we can write uh coefficients is equals to uh numpy dot fit poly poly fit and then what we need to give in we need to give in the list of the points and then we need to give in the uh number of degrees so here it's quadratic so so the degrees are two uh if it's cubic the degrees are three and so on so it is a second order polynomial function again there's a little bit of math involved you don't have to go into the theory that much but you need to know a little bit of basics like this equation what exactly are we doing so actually uh we can basically write it as a b and c because we know that these are the three things that we will be returned with so we can just use that this will give us the abc equation and based on this equation we can plot our line so we can predict what is going to happen okay one thing that i forgot is that the polyfit function basically requires two different lists the list of x and the list of y so we will have to change our code a little bit so instead of appending it to one list we can put here position list x and position list y so this is the easiest way to do this there are other methods as well that you can use so here we will put this as zero and here we'll put this as one so this will be position list x position list y and here we will put position list x and position list y so that will give us uh two positions and then we do have to declare them first so position list x and position list y so both of them will be empty in the beginning oops and what else um here you can pick any of the lists so position list x let's say because it doesn't matter if one of them is filled the other one will be filled as well then here there's a problem because we are uh we are using both the values of x and y so we will need to zip it so we will write here position list y and we will write here position list x and then we have to zip it because we want both the values we want to run two for loops at the same time so kind of so we will write it like this and then here instead of position um we can write position x and position y and then we have to put it in brackets otherwise it will not work so here we will give in position x and position y or or we can just say position is equals to position x and y and then position list uh i minus one uh what was that ah this is the value okay so here we will have to write bracket and then this will be x and the same thing will happen for y okay so now uh the code should work exactly the same as before uh yeah so it's displaying so it's good so the next thing we are going to do we are going to take these coefficients now that we have these coefficients we are going to put it in our equation and then we will check for each x value what is the value of y so our x axis is basically from 0 to 1 300 so 1 300 is the max value so we will create a list here we will say this is the uh x list is equals to we can put a list comprehension here basically a fancy for loop in a single line so we can write here item for uh item in range let's say 0 to 1 300. so this is the range that we have so it will give us a list 0 1 2 3 4 5 6 till 1 300 and for each of these values we are going to find the corresponding y value so once we have that we will plot it and that will give us the prediction so here in the poly list x we will write for x in x list we are going to loop through all the x values and then we are going to use these coefficient values we will write here y is equals to a multiplied by x to the power of 2 and then plus b multiplied by x plus c plus c so this will give us the value of y and then we can simply plot these values like we did before in the circles so in this time around instead of position we will put x and y and for the color let's put 0 2 5 5 and 0. so this will give it a purple color so that we can tell this one is a prediction and the green one is the actual value so let's run that and there's an error of course uh what is the error there is a bad argument uh oh yeah so this cannot be floating value so it has to be integer there you go wait why is it ah okay the the line is very thick so that's why we can't see the green one so we can put this as let's say two and let's try that again or let's make the green ones a little bit bigger because i can't really see them so the circle here for the green one is five let's make it ten and uh the two here let's make it five so there you go this is the green one and the purple one is the prediction so you can see how accurate that is like um after a few iterations there you go you can see how perfectly it follows the same curve just after having maybe seven eight points it is absolutely perfect let's try it with let's say number four there you go so it is amazing how well it performs after it changes direction and all that of course it's not going to work properly because it's a quadratic equation it it can hold it can only have one curve so it cannot be multiple bumps only one bump so that is pretty well it is working quite nicely uh should we do anything here i think that that should be enough to understand the concept of this and or let's let's try it with one there you go that's good that's good okay so next what we will do uh we are going to predict whether it hit um it will go in the basket or not so we are going to predict that so how can we tell that so for that we need to open this up in open in explorer open in explorer the ball dot png and i will tell you why i am doing this because we will open it up in paints we will right click and hit edit so here we need to see what is the value from here till here so we need to find that x and y value so the y will be the constant value so the height is not changing but the width is changing so we need the width from here till here so if the ball lands in between these we will say it is a basket if it lands outside that region we will say it is not a basket but we will check only when it is at this height at this height what is the value of the x we need to check that so if the value of the x is in between these two then we are going to say okay this is good otherwise we will say no it's not going to be a basket so we need this value so this value here is around 430 and this value here is around 3 20 let's go a little bit further 330 so 330 to 430 that's our x value let's write it down here so let's call this prediction and here the x values are from 3 30 to 430 these are the x values and then we need the y value so the y value um let's say is 588 for it's a little bit tilted but it should be fine let's say 590. so the y value y value is 590. so what exactly are we doing now we need to find the value of x when the value of y is 590 and if that x value is in between 330 to 430 it means it's a basket so that is what we need to do so we have our equation which is this y is equals to a x to the power of 2 plus b x plus c but here we input the value of x and we get the value of y we need the opposite we input the value of y and we get the value of x so what is the equation for that now i believe you have studied that in mathematics let me just write it here solving quadratic equation for x so let me show you the equation so i just googled it right now and here you can see so this is basically the equation so first of all you have to bring in the equation to this format that on one side you have 0 and then you use this equation that's how simple it is so let's do that so here what we will do is we will write it down so right now our equation is something like this y is this so to make this as side 0 we will remove the y from here and bring it here so it will be c minus y right so i hope that makes sense c minus y right and then we have the value of a and b so our equation so we will say that our small c is equals to this and then our a is equals to big a and b is equals to big b okay the b and the a are not changing but the c needs to change because we need to put it as zero then we can apply our formula now our formula is basically that x is equals to uh what was the formula it was minus let me let me try to remember because in a long time minus b yeah uh plus minus so either it will be plus or minus so for us it will stay constant uh i believe it will be minus if it's not we can change it so minus then we have square root sqrt math math dot sqrt and then it is uh i believe b squared b to the power of 2 minus 4 ac 4 multiplied by a multiplied by c then all of this is divided by 2 multiplied by a yes i think yes and don't forget the bracket if you don't put the bracket it will give you an error no it will not give you an error it will give you wrong values so don't forget the bracket okay let me check if i wrote the equation correct or not so b squared minus 4ac divided yeah okay so i didn't forget everything okay so um that is the the equation so that will give us the value of x now once we have this value we are going to check whether this value is in between 3 30 and 4 30. so we will say that if the the x is in between 3 30 and 4 30 then we will do something we will print let's say um basket basket there you go uh i think i'm making a mistake yes there is a big mistake the mistake is that this is not just y it has to be 590. so i forgot to add that so c minus 590. okay so let's try it out hopefully it will work all of this has to be inside inside this if statement that if there is a position if there is a ball detected and there is a position in the list then we do all this maths otherwise if the list is empty there's no point of doing the maths so here it did not do anything that is a bit strange so if position this this this oh it's not a basket that's why or we can write else uh else prints no no baskets basket come on no baskets yeah no basket no baskets and no basket good i think number four was the baskets so let's try it with that no basket no baskets and no basket really so there is something wrong so we need to check that uh let's print out the value of x so let's print the value of x and see what do we get so we are getting minus 600 and oh that's that's big numbers uh let's try it with plus yeah now it's better but it's still not in there the value of x are we using x somewhere else yeah but this is in the for loop so it should not matter minus b do we need to put all of this in brackets and we need to put all of this as integer maybe let's put it as integer let's run that okay let's try with the minus again and let's see what happens yeah basket good so now we are detecting so first it's saying no basket no basket then all of a sudden it starts saying baskets because this value is in between 430 and 330. so that should be a basket so uh in order to actually show it better what we can do is we can write we can what's the name of it cv zone cv zone come on cb zone dot put text rect and we can put uh it on our image contours and then we have to give in the text uh the text will be baskets and then we have to give in the position let's say uh 50 and 50 or let's push it down a little bit more 100 let's say the scale by the way the scale and all this is not important but we can make it bigger so let's say seven and the thickness let's say five uh the color yeah actually we should change the color as well because if it's detecting as the basket then we put it as green if it's not detecting as basket we put it as red so we can write color of the rectangle which is r let's put it down color of the rectangle is equals to 0 2 5 5 and 0. so we can copy all of this and we can paste it here in no basket and we can change this to 0 and bgr so this is red and then we will write here no baskets so no baskets baskets there you go perfect still doesn't look that good let's um let's put the scale as five and the thickness uh it's fine let's add our offset a little bit offsets is is the area around the rectangle so let's put it as 20. and let's push it down a little bit more because it is quite big yeah much better and the the green is too green so let's put it as 200 and let's put the red as 200 as one because it's when it's very bright it's a little bit annoying yeah now you can see clearly basket or no basket okay so now that we are getting the predictions uh what we need to do is we need to tell it to predict only when we have less than 10 frames so after 10 frames don't predict because um after 10 frames basically we are reaching the basket almost so we we want to predict before that not while it is doing the basket so here we can simply write that all of this prediction part will only be done if the length of our let's say position list x so this is how many points we have uh position list x is less than 10 then you will predict otherwise the prediction will remain the same so let's put all of this and the x will be there no but it will not print it after that so we need to print it after that as well so if this is the case uh okay so we can push this in oh sorry we can push this part in and let's try that yeah nobody's giving the wrong if length of position list x is less than 10 then this is the calculation and this should be the answer so what is this this is number four yeah it should work so it seems the x is changing after that why is the x changing uh okay what we can do is we can declare here at the top prediction prediction is equals to false so in the beginning the prediction is false and then the prediction is basically this part here so whether it's true or false it will be here and we can say that if prediction then do this so now it should work properly yeah so after 10 frames if there is a basket it will keep it as a basket it will not predict after the 10 frames so that is what we did just now so if we if we do it for let's say number three so then it will always say no baskets there you go so that's the main idea so this was our project for basket prediction and i hope you have learned something new here it was really a fun project because you get to see the output so if we go to number one you can see that it says no basket then we go to number two and then it says basket again then it goes to number three it says no basket again and number four it should say baskets so there you go so that is pretty cool how it actually is able to find the prediction and it is quite accurate based on what we have seen and it is quite fast if we put this as let's say one you will see how far this is there you go so it's so fast that we can't really see the whole thing that's why we have slowed it down so that we can see properly so this was the idea of today's project i hope you have learned something new if you have any ideas share it with me in the comments if you like the project give it a like and do check out our courses as well and if you have any suggestions put it in the comments and i will see you in the next one
Info
Channel: Murtaza's Workshop - Robotics and AI
Views: 118,709
Rating: undefined out of 5
Keywords:
Id: PVtmK8LmYpA
Channel Id: undefined
Length: 61min 46sec (3706 seconds)
Published: Wed Dec 22 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.