Color Tracking in OpenFramework

Hey Guys,

Blog Post after a long time, did some random stuff related to electronics and design but was not able to post anything. These days started working on OpenCV , OpenFramework again. Since there are lots of DIY tutorials on Installing OpenCV and OpenFramework so not posting it. After trying Hello World in OpenFramework, Thought of merging OpenCV and OpenFramework. So here is the 1st outcome, Color Tracking in OpenFramework using OpenCV API for it.

I am working on Ubuntu 12.04, Code:Blocks & I am tracking Red Color.

Using Project Generator of OpenFramework, Created an Empty Project. And after that you will get main.cpp, testApp.cpp & testApp.h files in src folder.

createProject

Make Sure you have ofxOpenCv   and ofxCv  addon installed properly in OF folder since it will have some examples so you can check those examples too.

Now In testApp.h , following code will be written.

#ifndef _TEST_APP
#define _TEST_APP
#include “ofMain.h”
#include “ofxOpenCv.h”
#include “ofxCv.h”

class testApp : public ofBaseApp{
public:
void setup(); //to setup a font fo this project
void update();
void draw(); //to draw the font on screen
void keyPressed(int);                         //On KEY Press Events will be defined here
void mouseMoved(int, int);            // On Mouse Move Events will be defined here
void mousePressed(int x, int y, int button); //On Mouse Press Events will be defined here
ofVideoGrabber movie;                          // movie object for capturing Video from Cam
ofxCvColorImage rgb;                           //rgb object for storing color image data
ofxCvGrayscaleImage filtered,red,green,blue;  //objects for storing grayscale image data
ofxCvContourFinder contours;                         //object to store contours of the filtered image
int w,h;

};

#endif

Now in testApp.cpp following code will be written :

#include “testApp.h”

int circleX, circleY,i, red, green, blue;
//————————————————————–
void testApp::setup(){
ofSetFrameRate(100);
ofBackground(150,50,10);
w = 640;
h = 480;
movie.initGrabber(w, h, true);
//reserve memory for cv images
rgb.allocate(w, h);
filtered.allocate(w, h);
red.allocate(w,h);
green.allocate(w,h);
blue.allocate(w,h);
}

//————————————————————–
void testApp::update(){

movie.update();

if (movie.isFrameNew()) {

//copy webcam pixels to rgb image
rgb.setFromPixels(movie.getPixels(), w, h);

//mirror horizontal
rgb.mirror(false, true);

//store the three channels as grayscale images

rgb.convertToGrayscalePlanarImages(red, green, blue);

green+=blue;   // adding green and blue channels then will subtract from red chanel to filter out only red
red -=green;
//filter image based on the hue value were looking for
for (int i=0; i<w*h; i++) {
filtered.getPixels()[i] = ofInRange(red.getPixels()[i],0,40) ? 0 : 255;
}

filtered.flagImageChanged();
//run the contour finder on the filtered image to find blobs with a certain hue
contours.findContours(filtered, 50, w*h/2, 1, false);
}

}

//————————————————————–

void testApp::draw(){
ofSetColor(255,255,255);

//draw all cv images
red.draw(0,0);
filtered.draw(0,480);
contours.draw(0,480);

ofSetColor(255, 255, 0);
ofFill();

//draw red circles for found blobs
for (int i=0; i<contours.nBlobs; i++) {
ofCircle(contours.blobs[i].centroid.x, contours.blobs[i].centroid.y, 5);
}
}

//—————————————————————
void testApp::keyPressed(int key){
if(key == 115)
{
i– ;
}
if(key == 119)
{
i++ ;
}
}

void testApp::mouseMoved(int x, int y){
cout << “mouseMoved: ” << x << “, ” << y << endl;
circleX = x;
circleY = y;
}

void testApp::mousePressed(int x, int y, int button){
//calculate local mouse x,y in image
int mx = x % w;
int my = y % h;

}

Now in Last main.cpp this code will be written :

#include “testApp.h”
#include “ofAppGlutWindow.h”

//————————————————————–
int main(){
//ofAppGlutWindow window; // create a window
// set width, height, mode (OF_WINDOW or OF_FULLSCREEN)
ofSetupOpenGL(1024, 768, OF_WINDOW);
ofRunApp(new testApp()); // start the app
}

Thats it, Now build and Run the code and you will get red color tracked and a yellow dot over it & start Play with the code

red color detect 2 red color track1

Advertisements

Control your mouse cursor by WIIMOTE

Since the Wii Remote uses bluetooth to communicate with the console, it’s relatively straightforward to use it to control a computer. The most obvious way is similar to the main menu on the Wii console – point the remote where you want the cursor to go, and press A and B to left and right click. There are also options for tilting the Wiimote to move the cursor around, which is useful if you don’t have a sensor bar available.

You can Do all this stuff by using a tool WMGUI which is a utility of CWiiD.

To install and make this work follow the instructions :-

sudo apt-get install libcwiid1

sudo apt-get install lswm


sudo apt-get install wmgui

sudo apt-get install wminput

Now load wmgui in terminal

Now click on Connect button in FILE

Select “connect” from the file menu, press 1+2 when prompted then OK. Lights and rumble can be turned on and off from the controls menu, and which inputs are displayed from the settings menu. Using this, you can test the IR camera, the accelerometers and check the inputs from the Nunchuck or Classic Controller.

Next up is the mouse “emulator” which allows you to control the mouse with the Wiimote. At this point, it can be run with default settings (tilting the Wiimote moves the pointer, A and B work as left and right click).

The uinput module needs to be loaded into the kernal first. This can either be done manually after every reboot:

lswm

This should return the address of the Wiimote (something like 00:1F:32:95:EF:B0). This will be different for each Wiimote. If it doesn’t work, try again, ensuring the lights on the Wiimote are still flashing when you run lswm.

Moving the mouse by tilting the Wiimote

Press the 1+2 buttons on the Wiimote and run:

sudo wminput 00:1F:32:95:EF:B0

replacing 00:1F:32:95:EF:B0 with the address of your Wiimote. This can be run without the address, but will take longer to connect.

Press 1+2 on the Wiimote and from a terminal run this:

wminput -c ir_ptr 00:1F:32:95:EF:B0

Running wminput as user (not root)

Normally wminput has to be run as root as the uinput device requires root priviliges. To allow any user to access it add a rule to /etc/udev/rules.d to change the mode of the device to “0600”, e.g

 sudo sh -c 'echo KERNEL\=\=\"uinput\", MODE\=\"0666\" > /etc/udev/rules.d/71-wiiremote.rules'

 

then reboot or restart the udev service

 

sudo service udev restart 

 

WMGUI as daemon

wminput -d 00:1F:32:95:EF:B0

Will run wminput in daemon mode – quiet output, waits indefinitely and continually retries to reconnect. Press 1+2 on the remote to connect, the remote powerbutton to disconnect.

nohup wminput -d 00:1F:32:95:EF:B0&

Will launch it quietly in the background.

 

By this you can easily Control your mouse cursor using WiiMote. Plus you can find accelerometer’s X-, Y- & Z- axes

Ubuntu 10.10 : Wi-Fi reloaded

Wifi problem solved when I tried to install Broadcom’s B43 drivers for my Dell Inspiron 1525. On its automatic Installation for additional drivers I was getting error

SystemError: installarchives() failed

So I got a link http://ubuntuforums.org/showthread.php?t=1593717
Steps I followed are :-

sudo apt-get –purge remove firmware-b43-installer
sudo apt-get –purge remove dkms
sudo apt-get –purge remove bcmwl-kernel-source
sudo apt-get install bcmwl-kernel-source
sudo reboot

This make my laptop’s Wi-fi in working state .

My minor project : Gesto-paint

Hey guys,

blogging after a long time. This time I am blogging about my minor project on my major interest HCI. I have titled it as Gesto-paint. As title itself suggests it is basically a controlling mouse using hand gestures. Paint is just as an application. This project is inspired from Jacob Andreas’s Red Glove project . Libraries and softwares, I am using are openCV, Octave and few more which will be updated later.