Python Hidden File Detection
Hidden File Detection. Jaraco.path provides cross platform hidden file detection. Python Wheel py2.py3.
A few things to note:. There’s a black border around the whole image, gray backing paper and then white paper with text on it. Only a small portion of the image contains text. The text is written with a tyepwriter, so it’s monospace. But the typewriter font isn’t across the collection. Sometimes a has two fonts!.
The image is slightly rotated from vertical. The images are 4x the resolution shown here (2048px tall). There are 34,000 images: too many to affordably. OCR programs typically have to do some sort of to find out where the text is and carve it up into individual lines and characters.
When you hear “OCR”, you might think about fancy Machine Learning techniques like. But it’s a dirty secret of the trade that page layout analysis, a much less glamorous problem, is at least as important in getting good results. The most famous OCR program is, a remarkably long-lived open source project developed over the past 20+ years at HP and Google. I quickly noticed that it performed much better on the Milstein images when I manually cropped them down to just the text regions first. So I set out to write an image cropper: a program that could automatically find the green rectangle in the image above. This turned out to be surprisingly hard! Problems like this one are difficult because they’re so incredibly easy for humans.
When you looked at the image above, you could immediately isolate the text region. This happened instantaneously, and you’ll never be able to break down exactly how you did it. The best we can do is come up with ways of breaking down the problem in terms of operations that are simple for computers. The rest of this post lays out a way I found to do this. First off, I applied the to the image.
This produces white pixels wherever there’s an edge in the original image. It yields something like this. This removes most of the background noise from the image and turns the text regions into bright clumps of edges. It turns the borders into long, crisp lines. The sources of edges in the image are the borders and the text. To zero in on the text, it’s going to be necessary to eliminate the borders. One really effective way to do this is with a.
This essentially replaces a pixel with something like the median of the pixels to its left and right. The text areas have lots of white pixels, but the borders consist of just a thin, 1 pixel line. The areas around the borders will be mostly black, so the rank filter will eliminate them. Here’s what the image looks like after applying a vertical and horizontal rank filter.
The borders are gone but the text is still there! While this is effective, it still leaves bits of text outside the borders (look at the top left and bottom right).
That may be fine for some applications, but I wanted to eliminate these because they’re typically uninteresting and can confuse later operations. So instead of applying the rank filter, I found the in the edge image. These are sets of white pixels which are connected to one another. The border contours are easy to pick out: they’re the ones whose covers a large fraction of the image. With polygons for the borders, it’s easy to black out everything outside them.
What we’re left with is an image with the text and possibly some other bits due to smudges or marks on the original page. At this point, we’re looking for a crop (x1, y1, x2, y2) which:.
maximizes the number of white pixels inside it and. is as small as possible. These two goals are in opposition to one another.
If we took the entire image, we’d cover all the white pixels. But we’d completely fail on goal #2: the crop would be unnecessarily large.
This should sound familiar: it’s a classic:. The recall is the fraction of white pixels inside the cropping rectangle. The precision is the fraction of the image outside the cropping rectangle. A fairly standard way to solve precision/recall problems is to optimize the, the harmonic mean of precision and recall.
This is what we’ll try to do. The set of all possible crops is quite large: W 2 H 2, where W and H are the width and height of the image. For a 1300x2000 image, that’s about 7 trillion possibilities! The saving grace is that most crops don’t make much sense. We can simplify the problem by finding individual chunks of text. To do this, we apply to the de-bordered edge image.
This “bleeds” the white pixels into one another. We do this repeatedly until there are only a few connected components. Here’s what it looks like. As we hoped, the text areas have all bled into just a few components. There are five connected components in this image.
The white blip in the top right corresponds to the “Q” in the original image. By including some of these components and rejecting others, we can form good candidate crops. Now we’ve got a: which subset of components produces a crop which maximizes the F1 score? There are 2 N possible combinations of subsets to examine. In practice, though, I found that a greedy approach worked well: order the components by the number of white pixels they contain (in the original image). Keep adding components while it increases the F1 score. When nothing improves the score, you’re done!
Here’s what that procedure produces for this image. That’s 875x233, whereas the original was 1328x2048. That’s a 92.5% decrease in the number of pixels, with no loss of text! This will help any OCR tool focus on what’s important, rather than the noise. It will also make OCR run faster, since it can work with smaller images. This procedure worked well for my particular application. Depending on how you count, I’d estimate that it gets a perfect crop on about 98% of the images, and its errors are all relatively minor.
If you want to try using this procedure to crop your own images, you can find the. You’ll need to install OpenCV, numpy and PIL to make it work. I tried several other approaches which didn’t work as well. Here are some highlights:.
I ran the image through Tesseract to find areas which contained letters. These should be the areas that we crop to! But this is a bit of a chicken and the egg problem. For some images, Tesseract misses the text completely. Cropping fixes the problem. But we were trying to find a crop in the first place!. I tried running the images through first, to remove noise and borders.
But this only worked some of the time and I found unpaper’s interface to be quite opaque and hard to tweak. I ran canny, then calculated row and column sums to optimize the x- & y-coordinates of the crop independently. The text regions did show up clearly in charts of the row sums: The four spikes are the tops and bottoms of the two borders. The broad elevated region in the middle is the text. Making this more precise turned out to be hard. You lose a lot of structure when you collapse a dimension—this problem turned out to be easier to solve as a single 2D problem than as two 1D problems.
In conclusion, I found this to be a surprisingly tricky problem, but I’m happy with the solution I worked out. In the next post, I’ll talk about my experience running OCR tools over these cropped images. Please leave comments! It's what makes writing worthwhile.
That son of a bitch. I knew he took my last beer.
These are words a man should never, ever have to say. But I muttered them to myself in an exasperated sigh of disgust as I closed the door to my refrigerator. You see, I had just spent over 12 hours writing content for the upcoming. My brain was fried, practically leaking out my ears like half cooked scrambled eggs.
And after calling it quits for the night, all I wanted was to do relax and watch my all-time favorite movie, Jurassic Park, while sipping an ice cold Finestkind IPA from Smuttynose, a brewery I have become quite fond of as of late. But that son of a bitch James had come over last night and drank my last beer. Well, allegedly.
I couldn’t actually prove anything. In reality, I didn’t really see him drink the beer as my face was buried in my laptop, fingers floating above the keyboard, feverishly pounding out tutorials and articles. But I had a feeling he was the culprit. He is my only (ex-)friend who drinks IPAs.
So I did what any man would do. I mounted a Raspberry Pi to the top of my kitchen cabinets to automatically detect if he tried to pull that beer stealing shit again. Looking for the source code to this post? OpenCV and Python versions: In order to run this example, you’ll need Python 2.7 and OpenCV 2.4.X. A 2-part series on motion detection This is the first post in a two part series on building a motion detection and tracking system for home surveillance. The remainder of this article will detail how to build a basic motion detection and tracking system for home surveillance using computer vision techniques.
This example will work with both pre-recorded videos and live streams from your webcam; however, we’ll be developing this system on our laptops/desktops. In the second post in this series I’ll show you how to update the code to work with your Raspberry Pi and camera board — and how to extend your home surveillance system to capture any detected motion and upload it to your personal Dropbox. And maybe at the end of all this we can catch James red handed A little bit about background subtraction Background subtraction is critical in many computer vision applications. We use it to count the number of cars passing through a toll booth.
We use it to count the number of people walking in and out of a store. And we use it for motion detection. Before we get started coding in this post, let me say that there are many, many ways to perform motion detection, tracking, and analysis in OpenCV.
Some are very simple. And others are very complicated. The two primary methods are forms of Gaussian Mixture Model-based foreground and background segmentation:. by KaewTraKulPong et al., available through the cv2. BackgroundSubtractorMOG function. by Zivkovic, and, also by Zivkovic, available through the cv2.
BackgroundSubtractorMOG2 function. And in newer versions of OpenCV we have Bayesian (probability) based foreground and background segmentation, implemented from Godbehere et al.’s 2012 paper,. We can find this implementation in the cv2. CreateBackgroundSubtractorGMG function (we’ll be waiting for OpenCV 3 to fully play with this function though). All of these methods are concerned with segmenting the background from the foreground (and they even provide mechanisms for us to discern between actual motion and just shadowing and small lighting changes)! So why is this so important?
And why do we care what pixels belong to the foreground and what pixels are part of the background? Well, in motion detection, we tend to make the following assumption: The background of our video stream is largely static and unchanging over consecutive frames of a video. Therefore, if we can model the background, we monitor it for substantial changes.
If there is a substantial change, we can detect it — this change normally corresponds to motion on our video. Now obviously in the real-world this assumption can easily fail. Due to shadowing, reflections, lighting conditions, and any other possible change in the environment, our background can look quite different in various frames of a video. And if the background appears to be different, it can throw our algorithms off.
That’s why the most successful background subtraction/foreground detection systems utilize fixed mounted cameras and in controlled lighting conditions. The methods I mentioned above, while very powerful, are also computationally expensive. And since our end goal is to deploy this system to a Raspberry Pi at the end of this 2 part series, it’s best that we stick to simple approaches. We’ll return to these more powerful methods in future blog posts, but for the time being we are going to keep it simple and efficient.
In the rest of this blog post, I’m going to detail (arguably) the most basic motion detection and tracking system you can build. It won’t be perfect, but it will be able to run on a Pi and still deliver good results.
Basic motion detection and tracking with Python and OpenCV Alright, are you ready to help me develop a home surveillance system to catch that beer stealing jackass? Open up a editor, create a new file, name it motiondetector. Py, and let’s get coding. FirstFrame = None Lines 2-6 import our necessary packages. All of these should look pretty familiar, except perhaps the imutils package, which is a set of convenience functions that I have created to make basic image processing tasks easier. If you do not already have installed on your system, you can install it via pip: pip install imutils.
Next up, we’ll parse our command line arguments on Lines 9-12. We’ll define two switches here. The first, - video, is optional. It simply defines a path to a pre-recorded video file that we can detect motion in. If you do not supply a path to a video file, then OpenCV will utilize your webcam to detect motion.
We’ll also define - min - area, which is the minimum size (in pixels) for a region of an image to be considered actual “motion”. As I’ll discuss later in this tutorial, we’ll often find small regions of an image that have changed substantially, likely due to noise or changes in lighting conditions. In reality, these small regions are not actual motion at all — so we’ll define a minimum size of a region to combat and filter out these false-positives. Lines 15-21 handle grabbing a reference to our camera object. In the case that a video file path is not supplied ( Lines 15-17), we’ll grab a reference to the webcam. And if a video file is supplied, then we’ll create a pointer to it on Lines 20 and 21.
Lastly, we’ll end this code snippet by defining a variable called firstFrame. Any guesses as to what firstFrame is? If you guessed that it stores the first frame of the video file/webcam stream, you’re right. Assumption: The first frame of our video file will contain no motion and just background — therefore, we can model the background of our video stream using only the first frame of the video. Obviously we are making a pretty big assumption here.
But again, our goal is to run this system on a Raspberry Pi, so we can’t get too complicated. And as you’ll see in the results section of this post, we are able to easily detect motion while tracking a person as they walk around the room. Continue So now that we have a reference to our video file/webcam stream, we can start looping over each of the frames on Line 27.
Hidden File Problem
A call to camera. Read ( ) returns a 2-tuple for us. The first value of the tuple is grabbed, indicating whether or not the frame was successfully read from the buffer.
The second value of the tuple is the frame itself. We’ll also define a string named text and initialize it to indicate that the room we are monitoring is “Unoccupied”. If there is indeed activity in the room, we can update this string. And in the case that a frame is not successfully read from the video file, we’ll break from the loop on Lines 35 and 36. Now we can start processing our frame and preparing it for motion analysis ( Lines 39-41). We’ll first resize it down to have a width of 500 pixels — there is no need to process the large, raw images straight from the video stream.
We’ll also convert the image to grayscale since color has no bearing on our motion detection algorithm. Finally, we’ll apply Gaussian blurring to smooth our images. It’s important to understand that even consecutive frames of a video stream will not be identical! Due to tiny variations in the digital camera sensors, no two frames will be 100% the same — some pixels will most certainly have different intensity values. That said, we need to account for this and apply Gaussian smoothing to average pixel intensities across an 21 x 21 region ( Line 41). This helps smooth out high frequency noise that could throw our motion detection algorithm off. As I mentioned above, we need to model the background of our image somehow.
Again, we’ll make the assumption that the first frame of the video stream contains no motion and is a good example of what our background looks like. If the firstFrame is not initialized, we’ll store it for reference and continue on to processing the next frame of the video stream ( Lines 44-46). Here’s an example of the first frame of an example video. Figure 3: An example of the frame delta, the difference between the original first frame and the current frame. Notice how the background of the image is clearly black.
However, regions that contain motion (such as the region of myself walking through the room) is much lighter. This implies that larger frame deltas indicate that motion is taking place in the image. We’ll then threshold the frameDelta on Line 51 to reveal regions of the image that only have significant changes in pixel intensity values. If the delta is less than 25, we discard the pixel and set it to black (i.e. If the delta is greater than 25, we’ll set it to white (i.e.
An example of our thresholded delta image can be seen below. Figure 4: Thresholding the frame delta image to segment the foreground from the background.
Again, note that the background of the image is black, whereas the foreground (and where the motion is taking place) is white. Given this thresholded image, it’s simple to apply contour detection to to find the outlines of these white regions ( Line 56). We start looping over each of the contours on Line 60, where we’ll filter the small, irrelevant contours on Line 62 and 63. If the contour area is larger than our supplied - min - area, we’ll draw the bounding box surrounding the foreground and motion region on Lines 67 and 68. We’ll also update our text status string to indicate that the room is “Occupied”. DestroyAllWindows ( ) The remainder of this example simply wraps everything up. We draw the room status on the image in the top-left corner, followed by a timestamp (to make it feel like “real” security footage) on the bottom-left.
Lines 77-80 display the results of our work, allowing us to visualize if any motion was detected in our video, along with the frame delta and thresholded image so we can debug our script. Note: If you download the code to this post and intend to apply it to your own video files, you’ll likely need to tune the values for cv2. Threshold and the - min - area argument to obtain the best results for your lighting conditions. Finally, Lines 88 and 89 cleanup and release the video stream pointer.
Results Obviously I want to make sure that our motion detection system is working before James, the beer stealer, pays me a visit again — we’ll save that for Part 2 of this series. To test out our motion detection system using Python and OpenCV, I have created two video files. The first, example01.
Mp4 monitors the front door of my apartment and detects when the door opens. The second, example02. Mp4 was captured using a Raspberry Pi mounted to my kitchen cabinets. It looks down on the kitchen and living room, detecting motion as people move and walk around. Let’s give our simple detector a try.
Open up a terminal and execute the following command. Figure 6: Again, our motion detection system is able to track a person as they walk around a room.
And again, here is the full vide of our motion detection results: So as you can see, our motion detection system is performing fairly well despite how simplistic it is! We are able to detect as I am entering and leaving a room without a problem.
However, to be realistic, the results are far from perfect. We get multiple bounding boxes even though there is only one person moving around the room — this is far from ideal. And we can clearly see that small changes to the lighting, such as shadows and reflections on the wall, trigger false-positive motion detections. To combat this, we can lean on the more powerful background subtractions methods in OpenCV which can actually account for shadowing and small amounts of reflection (I’ll be covering the more advanced background subtraction/foreground detection methods in future blog posts). But for the meantime, consider our end goal. This system, while developed on our laptop/desktop systems, is meant to be deployed to a Raspberry Pi where the computational resources are very limited. Workshop manual for peugeot 106 sport.
How To Show Hidden File
Because of this, we need to keep our motion detection methods simple and fast. An unfortunate downside to this is that our motion detection system is not perfect, but it still does a fairly good job for this particular project. Finally, if you want to perform motion detection on your own raw video stream from your webcam, just leave off the - video switch. $ python motiondetector.py Summary In this blog post we found out that my friend James is a beer stealer. What an asshole. And in order to catch him red handed, we have decided to build a motion detection and tracking system using Python and OpenCV. While basic, this system is capable of taking video streams and analyzing them for motion while obtaining fairly reasonable results given the limitations of the method we utilized.
The end goal if this system is to deploy it to a Raspberry Pi, so we did not leverage some of the more advanced background subtraction methods in OpenCV. Instead, we relied on a simple yet reasonably effective assumption — that the first frame of our video stream contains the background we want to model and nothing more. Under this assumption we were able to perform background subtraction, detect motion in our images, and draw a bounding box surrounding the region of the image that contains motion.
In the second part of this series on motion detection, we’ll be updating this code to run on the Raspberry Pi. We’ll also be integrating with the Dropbox API, allowing us to monitor our home surveillance system and receive real-time updates whenever our system detects motion. Hey Moeen, if your camera is not fixed, such as a camera mounted on a quad-copter, you’ll need to use a different set of algorithms — this code will not work since it assumes a fixed, static background.
For color based tracking you could use something like CamShift, which is a very lightweight and intuitive algorithm to understand. And for object/structural tracking, HOG + Linear SVM is also a good choice. My personal suggestion would be to use adaptive correlation filters, which I’ll be covering in a blog post soon. Hello Adrian! Thank you so much for the comprehensive tutorials!
Best that I have seen. 🙂 Quick question: in this post , you say: “You might guess that we are going to use the cv2.VideoCapture function here — but I actually recommend against this.
Getting cv2.VideoCapture to play nice with your Raspberry Pi is not a nice experience (you’ll need to install extra drivers) and something you should generally avoid.” However in this tutorial, you use cv2.VideoCapture. Can you explain the change? Thank you again! I am stepping through these tutorials on a Pi B+. I am able to get through this tutorial, the only major issue was that initially I had not installed imutils, but after installing it the code it works(kinda) the cursor simply moves to the next line, blinks a handful of times and then the prompt pops back up. I have dropped a few debug lines in the code to ensure the code is executing (and it is), it just doesn’t seem to be executing in a meaningful way.
The camera for sure works (tested it after running the code). Any ideas as to what might be happening? I just read the comment that says that this was not meant to be run on a pi.my bad.
I am using python 3.4 on a Linux Arch machine. However I am able to fix the problem by replacing the from convenience import.
To from imutils.convenience import. In the init.py However, I got another error when trying to execute the code (which I downloaded from your site): File 'motiondetector.py', line 61, in cv2.CHAINAPPROXSIMPLE) ValueError: too many values to unpack (expected 2) ermmmissing one variables in this line? (cnts, ) = cv2.findContours(thresh.copy, cv2.RETREXTERNAL, cv2.CHAINAPPROXSIMPLE). Hello Adrian, Thank you for your tutorial. It has been very helpful to me. I also have to admit that John’s code has been useful as well. I’m trying to make a vehicle detection and tracking program (nothing fancy – mainly for fun).
So far I have been very satisfied with the program, but I feel like, that finding a difference between the current frame and the first one is not the best solution for me, because in some test videos it results in false detection, mainly because of huge changes between frames etc. Maybe you can give any advice how to improve or fix this? Also – if you have other advices in terms of vehicle detection and tracking, I would be very glad to hear about them. Anyway – Thank you in advance. Hey Gabriel, I have not done any tutorials related to velocity, but it is certainly possible. But in the most simplistic form, the algorithm is quite simple if you define two identifiable markers in a video stream and know the distance between them (in feet, meters, etc.) Then, when an object moves from one marker to the other, you can record how long that travel took, and be able to derive a speed. Again, while I don’t have any tutorials related to velocity, I think this tutorial on computing the might be interesting for you.
Hi Adrian, Awesome website. I was going through the motion-detector.py script here and was having quite a bit of fun with it using my night-vision camera. It was interesting to see there was quite a bit of noise between frame to frame. Anyway, the point here is I was working well when all of a sudden after a reboot I am having this problem, the script doesn’t run. Essentially (grabbed) is False and the script breaks. I spent hours scouring this site and other web searches to see what went wrong.
I gave up and reinstalled a new version on my Pi 3, the most recent Noobs. I went through and still it does not work. When I try to install the libv4l-dev it says the most recent version is installed.
I am not sure what is going on but it was incredibly frustrating because I had it working once! A couple other things: I was using an older version of raspbian (at least 6 months) when I first had it working.
If I vaguely remember right I might have had an update pending after reboot. However, being sloppy I just kept working. I also installed programs like VLC. This was all before reinstalling a new version of Noobs. Since this was a recent comment I am just wondering if there was something broken in a recent update. This is just a guess and the likely scenario is I am doing something wrong. But I had it working, reinstalled the OS, tried the instructions line by line, and still nothing.
If you could provide any extra help/direction into the matter I would be much appreciative. Hi, thanks for the great tutorial! It’s very helpful.
One question though, in this tutorial you use: camera = cv2.VideoCapture(0) while in this tutorial: you said you prefer to use picamera module: (from comments) “When accessing the camera through the Raspberry Pi, I actually prefer to use the picamera module rather than cv2.VideoCapture. It gives you much more flexibility, including obtaining native resolution. Please see the rest of this blog post for more information on manually setting the resolution of the camera” so what changed here? Hi, Thanks for the excellent post. I was learning Object detection by Opencv and python using your code, Moving object in my video was small (rather human it’s an insect moving on white background) and video was captured by a 13 megapixel Mobile camera. When object starts to move it left a permanent foot print at the initial point and hence tracker will show two rectangle one at the side of origin and the other tracker move according to object current prostitution.
Why does it detect two contour instead of one which is actually tracking the movement. No worries, your english is great. To start, make sure you are using a Pi 2. That’s definitely a requirement for real-time video processing with the Raspberry Pi. Secondly, try to make the image you are processing for motion as small as possible. The smaller the image is, the less data there is, and thus the pipeline will run faster.
Also, keep an eye on the PyImageSearch blog over the next few weeks. I’ll be releasing some code that allows the frames to be read in a separate thread (versus the main thread). This can give some huge performance gains. Hi Adrian, Firstly, thanks for a brilliant tutorial.
And secondly I was wondering whether you’d be willing to suggest a way of splitting input video? So what I mean is, for example, if there’s a 10minute clip with 30seconds of motion somewhere in the middle – I would want the output video to just be the 30s (+ a couple of seconds either side perhaps).
I’ve worked out that this can be done using FFMPEG, but I’m not sure how to retrieve the in and out points from your code to feed into FFMPEG. So I suppose that my questions are: 1) Is using FFMPEG a necessary/wise choice for splitting the video? 2) How do I get in and out points from your motion detection code? Any advice you could give would be greatly appreciated. Hi Adrian, Thank you very much for this tutorial. I’m new to computer vision! I’m currently working on a project which involves background subtraction technique.
Your code uses the first frame as a reference to next frames and that is how it detects motion. All what I need is to have a reference frame that changes over a specified period of time, and then do exactly what the rest of the code does. How do I modify your code (if that’s okay) to achieve that? To be more specific; a reference frame that continuously changes over a specified period of time. Ahh, that makes perfect sense! I implemented this and some other changes and I have learned much.
I’m capturing the images now when certain triggers are met with cv2.imwrite(‘ localpath’, img) but now I need to figure out how to clear the “buffer” of the image that is written locally. Each time it does save to local disk it just keeps writing the same image over and over again. What I have tried so far seems to actually release the camera all together instead of just resetting the frame. Any suggestions?
Hidden File Virus
How hard would it be to track detected motion regions between consecutive frames? Using createBackgroundSubtractorMOG2 for example for use with more dynamic backgrounds doesn’t have the results it could have.
In ‘Real-time bird detection based on background subtraction’ by Moein Shakeri and Hong Zhang, they deal with the problem by tracking objects between frames and if it is present for N frames then it’s probably a moving object. I had a look at your post which was interesting and using moments, created lists for x and y coordinates thinking that i could compare elements in a list between successive frames but this happens: currentframex 0, 159, 139, 31 previousframex 0, 141, 29 there’s a new element ‘159’ so I cant compare elements like for like Is there a better way basically? I couldn’t figure it out! Hi Adrian, First of all, thanks for the great tutorial 😀 I’m working on a video surveillance system for my thesis and I need a background subtraction algorithm that permits to continously detect the objects even if they stop for a while. I have done various experiments with cv2.createBackgroundSubtractorMOG2 changing the parameter “history”, but, even if I set it to a very big value, even the objects that stop for just a second are recognized as background.
So, from this point of view, is it possible that your approach is better than those proposed by Zivkovic? That really depends on the quality of your video stream, the accuracy level required, lighting conditions, computational considerations, etc. For situations with controlled lighting conditions background subtraction methods will work very, very well. For situations where lighting can change dramatically or the “poses” you need to recognize people in can change, then you might need to utilize a machine learning-based approach. That said, I normally recommend starting off with simple background subtraction and seeing how far that gets you.
Hi adrian i’m really impressed by your motioni detecting project. As i am a novice in opencv or python, i have some questions. In our project we want to use this program on the alley so there could be parked cars or laid something else. In that case, the program maybe in ‘occupied condition’ because of cars or other things. Thus i want to add more function like change the first frame image as a new frame which the webcam is looking at if there is nothing detected newly by the camera. But in my opinion this is really difficult to make TT.
Could you help or advise us?? Hi Adrian, thanks once again for the amazing tutorial, i have exactly same problem as “Berkay Aras” owns, when I do sudo python motiondetector.py It gives no problem but it’s not showing anything.
Program is not running? I am using Raspberry pi 2 with installed OpenCV 3.1.0 and picamera. I have no idea why i did not get anything, i am using Downloaded code from your blog. Any idea please! It stop here after executing run command.
Pi@GbeTest: $ python test2.py –video videos/example1.mp4 pi@GbeTest: $. I am having a final project with “people motion detection with Raspberry” that means, after detect people with camera pi, sim900 will sent a message for owner. So i have 2 question: 1.Can i run this code for my project? 2.How can i use sim900 with raspberry?
I read your “home-surveillance-and-motion-detection-with-the-raspberry-pi-python-and-opencv”, but with dropbox, i want to run in no-wifi enviroment? So i think i can do with this code – basic motion detection and tracking with python and open cv. Hello Adrian!
Good morning! Thank you very very much! I am a student from china.Recently, i was stumped by the question that how to build a system which can count how many people in classroom.It’s your this tutorial that gave me ideas and approaches! I’m so glad and lucky to find your website in this wonderful world! But some questions still confuse me.how motion detection can detect many individuals and count the quantity of people at the same time?
If this need some face detector or head and shoulders detector in opencv? Could you give me some ideas or solutions? Thank you very much. Interested in whether you think this can run fast enough to track a rocket launch. I’m considering automating a tracker to improve model rocket photography/video (3D-printed gearbox/tripod head driven by servos).
High-end of “small” rockets: A bit bigger: I realize the changing background is an issue – but if you look at the videos, once the camera head has tilted up, it doesn’t have to move much. I’m thinking I could create a system adapted for the rapid acceleration that only lasts the first fraction of a second. Interested in any ideas. Trying to use this code to track squirrels in my backyard off a video feed. Code is working well. Unfortunately, despite trying different arguments for min size and threshold, there is too much stuff moving and it is putting bounding boxes around many, many items.
This is despite me rewriting the first frame to the current frame about every 3 frames of the feed. Maybe someone can point me in the right direction as to a methodology. I am trying to: 1. Identify likely squirrel objects from a video feed. Grab that image and put it through a CNN to determine squirrel or not.
If a squirrel, then track it. I have the tensorflow CNN working. Just not sure of the right approach for 1.
Right now the camera is stationary, but in the future I would like the camera to also be panning, if that makes a difference in the recommendation. Thanks in advance for any help.
Thank you for the response. Your website and examples have been a huge help. My CNN for classification is working well. The motion detection algorithm for an outdoor video is providing far too many ROIs to analyze as many things are moving. This will be especially true if the camera pans. I tried simple blob detection converting images to HSV and filtering for grey (squirrel color) and that works well if the squirrel is on a green lawn and not so well when the squirrel is in woods (where there are many things colored grey).
Trying adaptive correlation filters worked well on something like deer walking because they move slowly, but has been a bust because the squirrel moves in bursts and changes shape rapidly and the algorithm can’t keep up. I am considering trying YOLO next. Thanks Adrian, I have another question.
In the beginning of the post you mentioned that “The methods I mentioned above, while very powerful, are also computationally expensive. And since our end goal is to deploy this system to a Raspberry Pi at the end of this 2 part series, it’s best that we stick to simple approaches. We’ll return to these more powerful methods in future blog posts, but for the time being we are going to keep it simple and efficient.” Are you planning to have some post on the more powerful methods because I tired to look for it in the blog but I was not able to find it. The motion detection of videos which your provide works on my raspberry pi 3, but you said that:” Finally, if you want to perform motion detection on your own raw video stream from your webcam, just leave off the –video switch:” But when I run without video switch I don’t get any video output on screen and terminal in approximately one second finished execution of command which suggest that program do not detect motion of cam stream. Is this problem related with version of cv which is 3.2 in my case?
Can you publish code which will do motion detection from video taken on raspberry pi 3 with open cv 3.2? Hey Adrian, at first really great tutorial (just as any other you have on your website) I’m facing one problem trying to run the python program.
Nothing happens (python is probably breaking it) I’m trying to run it from the file (even from those from you and with your code), not from the webcam. When I’m “commenting” the “If not grabbed: break” I’ve got the ‘NoneType’ error “object has no attribute ‘shape’ so it looks like the path to the file is wrong but I’ve also checked your object tracking tutorial (with the tennis ball) and there, running program with the same file works. I’m confused, do you know what can be the cause of it? OpenCV installed properly just as you demonstrated.
Will be very grateful for advice. I actually had a question about the running python in a vitural environment compared to python’s regular environment.
I installed Python+OpenCV two different methods, your method and another one I found off youtube. Then ran the code using both the regular and virtual environment and didn’t see a significant change (except that on my other install it has opencv3; read the “Alejandro” post, thanks it worked perfectly). Oh but for those who didn’t use your install method will be missing the imutils module, and I ran into errors using “pip install imutils”. But if you use “sudo pip install imutils” than it will install perfectly (for those who didn’t use your install method).
BTW, read your Practical Python+OpenCV book and loved it. Very easy to comprehend and appreciated how you explained everything. I was curious if you will be coming out with another book that specifically tailors towards camera tracking and more advanced topics? Hi Adrian, great tutorial! But when i have read the title i don’t find an implementation of tracking. The code is an implementation of detection but not tracking; in other words tracking is when, after a detection, you identify the object to detect and, frame by frame, you keep the information about it (location, speed, etc) and build a model to predict the position in the next video frame.
Algorithm models like kalman filter, optical flow, mean-shift or cam-shift. I would appreciate your implementation in future tutorials or courses Thanks to much Albert. Thanks Adrian for the tutorial! Everything worked fine except for the Dropbox package. After contacting Dropbox support, I was informed that Client.pyc and Client.py no longer exist and is taken over by one file dropbox.py. With this curve ball, I was wondering how I can still connect to my Dropbox account without having access to these files. Another Question: I am in the middle of creating an Android app to host the live feed and was wondering if there’s a way to stream the video live given the fact that I am programming in Java.
But when you run it in a python shell it imports it fine yes I start by: source /.profile workon cv cd /Pythonprograms sudo python Script.py however an error comes up saying no module called imutils found. But when I’m in my virtual environment and type python to get the shell up, when I type import imutils it works fine Yes ive checked and I am in my virtual environment with it saying imutils is imported, just wont work with scripts. Does it have something to do with not supporting python 3.5 or raspian stretch?
Thanks for this great tutorial! It really helps me a lot for newbie like me, but i have a problem i finish writing the script with exact name on your tutorial, but when i run the “python motiondetection.py –video videos/example01.mp4” command, the video screen doesn’t pop out. I already finish your previous tutorial, the access pi camera with python and opencv one. And it worked without problem and the video screen does pop out. I need help to solve this,but i don’t know where the error is.
I’ll be waiting for your response. Sorry for my bad english, 😀. Thnx, your beer code runs fine, but in the URL mentioned in my previous post they use more advanced trackers.
In the samplecode you can select which tracker to use. All of them fail, it doesn’t detect anything. Maybe the Pi can’t handle this? Al sentrygun projects I’ve seen so far use a fixed cam. I think it’s better to use a a cam that moves with the gun.
All I need to do is move the cam so that the object is in the center of the image. Then fire it. But then I have to detect a moving object on a moving background. Maybe something like this: – detect moving object, direction and speed (need 2 framesfor that) – move cam/gun towards the object – check again with 2 frames while cam is steady. – do that again until target is locked.