I've just taken my robot for a walk to collect some data, while I wait for the 40GB to copy I thought I'd do a quick post. A few months ago I was playing the HoG detector in +OpenCV and using the PETS2009 data set.
My idea was that I might create a home security system from a bunch of old bits of hardware that are gathering dust.
- 1 x HTC Magic
- 1 x HTC Desire
- 1 x Fat Gecko Suction Mount
- 1 x Old HP Laptop
The plan is to use the two devices as IP Cams using this nifty app. Using the CURL lib I can access the images from C++ really easily and start throwing them at OpenCV
Here's a quick clip of the HoG detector running on the PETS09 data. It's not bad for an out-of-the-box solution.
OpenCV is available for Android so I could try running it directly on the handset, however the Magic isn't the most powerful, neither is the Desire; they are unlikely to be able to process the images as fast as even a beaten up old lappy.
Now that the images are being fed into OpenCV it's time to think about how I want to process them. Face recognition for the front door? Build a database of visitors? Get it to welcome me home?
Below is the code (mostly taken from CURL examples) to obtain the images from a network location and an example of the OpenCV HoG detector.
struct memoryStruct { char *memory; size_t size; }; static void* CURL_realloc(void *ptr, size_t size) { /* There might be a realloc() out there that doesn't like reallocing NULL pointers, so we take care of it here */ if(ptr) return realloc(ptr, size); else return malloc(size); } size_t WriteMemoryCallback (void *ptr, size_t size, size_t nmemb, void *data) { size_t realsize = size * nmemb; struct memoryStruct *mem = (struct memoryStruct *)data; mem->memory = (char *) CURL_realloc(mem->memory, mem->size + realsize + 1); if (mem->memory) { memcpy(&(mem->memory[mem->size]), ptr, realsize); mem->size += realsize; mem->memory[mem->size] = 0; } return realsize; } Mat getNewFrameFromAndroid(CURLcode res, memoryStruct buffer, CURL *curl) { while (true) { // set up the write to memory buffer // (buffer starts off empty) buffer.memory = NULL; buffer.size = 0; curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.8:8080/shot.jpg"); // tell libcurl where to write the image (to a dynamic memory buffer) curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION, WriteMemoryCallback); curl_easy_setopt(curl,CURLOPT_WRITEDATA, (void *) &buffer); // get the image from the specified URL res = curl_easy_perform(curl); // decode memory buffer using OpenCV cv::Mat imgTmp; imgTmp = cv::imdecode(cv::Mat(1, buffer.size, CV_8UC1, buffer.memory), CV_LOAD_IMAGE_UNCHANGED); if (!(imgTmp.empty())) { return imgTmp; } } }
HOGDescriptor hog; hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); vector<Rect> found; hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);
No comments:
Post a Comment