Wednesday 24 April 2013

How to make a custom QT project template

In this article, we will learn how to create a project template in QT creator . Why would I need custom QT project template you ask? If you work with multiple external libraries like OpenCV, QWT etc, you would have to manually add the libraries' path into the project file for every new project that requires them; this quickly becomes an inconvenience if you have a lot of projects and you don't know the configuration by heart. So lets get started.

QT Template

This tutorial is not intended to discuss QT templates in-depth for such a tutorial you would need to refer to the QT documentation. Rather, I have created a sample custom QT project template and would explain the needed alteration so you can use this to create your own template. As soon as you have gotten the sample from here and extracted the contents you should see something similar to the default QT GUI project except for wizard.xml. Before I get into what that does, let's see how to install this project template.

Installing the custom QT project template

After extracting the folder containing the project template, you would need to copy this folder into the share/qtcreator/templates/wizards/ folder in your QtCreator folder, the location of this folder will vary depending on where you installed QT. Also depending on where you installed QtCreator you might need root permission on a Linux machine before copying. Once copied, you can launch Qt creator and open the new Project wizard you should see a new project category and a new project type. selecting this new type would open a wizard which would contain the regular pages used to create a project with an extra page titled "Add External Libraries" in this sample I have included check-boxes for OpenCV and QWT selecting anyone of these would include the specified library into the created project.

How does this work?

The major job is done in wizard.xml. Most of the xml elements are self explanatory...for deeper knowledge about each element checkout the QT documentation. More importantly the <files> element allows you to specify what files you want to be added to the project by changing this you can convert the template into a console project template or any other project. Equally important is the <fields> element which allow us to add a new wizard page and throw in some check-boxes via the <field> tags. Each field has a name, a control and description.
<wizard version="1" kind="project"
        class="qt4project" firstpage="10"
        id="A.customqtproject" category="B.CustomProjects">
    <icon>console.png</icon>
    <description>Creates a custom Qt project which allows you to include external libraries.</description>
    <displayname>Custom QT Projects</displayname>;
    <displaycategory>Custom Projects</displaycategory>
    <files>
        <file source="main.cpp" openeditor="true"/>
	<file source="mainwindow.cpp" openeditor="false"/>
	<file source="mainwindow.h" openeditor="false"/>
	<file source="mainwindow.ui" openeditor="false"/>        
	<file source="project.pro" target="%ProjectName%.pro" openproject="true"/>
    </files>
    <!-- Create a 2nd wizard page with parameters -->
    <fieldpagetitle>Add External Libraries</fieldpagetitle>
    <fields>
	<field name="OPENCV">
            <fieldcontrol class="QCheckBox" truevalue="" falsevalue="# "/>
            <fielddescription>Include OpenCV Libraries</fielddescription>
        </field>
	<field name="QWT">
            <fieldcontrol class="QCheckBox" truevalue="" falsevalue="# "/>
            <fielddescription>Include QWT Libraries</fielddescription>
        </field>
    </fields>
</wizard>
A few alterations were made to the project.pro file. We append the following lines to the bottom of the default QT GUI project file.
# Opencv Library
%OPENCV%INCLUDEPATH += "/usr/local/include/opencv2"
%OPENCV%LIBS += `pkg-config --cflags --libs opencv`

# Qwt library
%QWT%CONFIG += qwt
%QWT%INCLUDEPATH +="/usr/local/qwt-6.1.0-rc3/include"
%QWT%LIBS += -L/usr/local/qwt-6.1.0-rc3/lib -lqwt
The first two lines are the configuration for an OpenCv project on my machine. You will need to change this to suit your system. Note that the configuration is preceded by name of the field for the configuration inserted between two percentage signs. To add more libraries to your template you simply add more fields to the wizard and add the configuration for that library to the .pro file preceded by the name of the controlling field.When a new project is created using this template the wizard simply checks which field is not selected and it comments that out but if it is selected it is included.

Conclusion

This tutorial has shown just one way to make a custom QT project template. I chose this method because it is typical for me to start a project with one library and half way into the project remember I need another library so with this method all I need to do is uncomment the desired library in the project file. Happy and hopefully faster coding!

Tuesday 23 April 2013

How to install OpenCV on OpenShift

I wanted to deploy an OpenCV(Python) application on the internet and needed a free hosting service after searching I found OpenShift which is an Platform as a service provider. They offer a variety of application type (python, ruby, php, django etc.) The free tier allow you to host 3 application with 1GB of storage. So it took me weeks before I could get OpenCV installed properly with no errors - one major problem was storage constraints so I had to delete any file that was unimportant and install only the necessities. After the whole thing was over I thought it would be nice to write about it.

Sign up and create an application

The first step would be to sign up for an OpenShift account. Then create a new application select a Do-It-Yourself (custom) application and complete the wizard. After the wizard is completed you would need to go to the application page and copy the secure shell (ssh) session command which you can access by clicking the "WANT TO LOG IN TO YOUR APPLICATION?" link. Having copied the command, open a terminal and paste it to get started.

Installation

Disclaimer: From here on you're going to be looking at loads of scrolling text. So if you are allergic to boredom get a drink or open up a movie on the side. Copy the scripts below and paste in the command line. Note that I delete the apps , data and doc folders from the OpenCV installation so as to save space this could be a problem if you need haarcascade.xml or any stuff located in these folders, so if that is your case you must check and customize your installation from line 57 of the script but be careful to avoid the "Disk quota exceeded" error.
# Install python
cd $OPENSHIFT_TMP_DIR
wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
tar jxf Python-2.7.3.tar.bz2
cd Python-2.7.3
./configure --prefix=$OPENSHIFT_DATA_DIR --enable-shared
make
make altinstall

export PATH=$OPENSHIFT_DATA_DIR/bin:$PATH
export LD_LIBRARY_PATH=$OPENSHIFT_DATA_DIR/lib

# Install setuptools
cd $OPENSHIFT_TMP_DIR
wget --no-check-certificate https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg#md5=fe1f997bc722265116870bc7919059ea
sh setuptools-0.6c11-py2.7.egg

export PATH=$OPENSHIFT_DATA_DIR/bin:$PATH
export LD_LIBRARY_PATH=$OPENSHIFT_DATA_DIR/lib

# Install pip
cd $OPENSHIFT_TMP_DIR
wget --no-check-certificate http://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz
tar zxf pip-1.1.tar.gz
cd pip-1.1
python2.7 setup.py install --prefix=$OPENSHIFT_DATA_DIR/lib/python2.7/site-packages/
python2.7 setup.py install

export PATH=$OPENSHIFT_DATA_DIR/bin:$PATH
export LD_LIBRARY_PATH=$OPENSHIFT_DATA_DIR/lib

# Install numpy
$OPENSHIFT_DATA_DIR/bin/pip install numpy

# House-cleaning
cd $OPENSHIFT_TMP_DIR
rm -r Python-2.7.3
rm Python-2.7.3.tar.bz2
rm -r pip-1.1/
rm pip-1.1.tar.gz
rm setuptools-0.6c11-py2.7.egg

# Install CMake
cd $OPENSHIFT_TMP_DIR
wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz
tar xvf cmake-2.8.10.2.tar.gz
cd cmake-2.8.10.2
./configure --prefix=$OPENSHIFT_DATA_DIR
gmake
gmake install

# Download OPenCV
cd $OPENSHIFT_TMP_DIR
wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.3/OpenCV-2.4.3.tar.bz2/download
tar xvf OpenCV-2.4.3.tar.bz2

# More House-cleaning
rm cmake-2.8.10.2.tar.gz
rm OpenCV-2.4.3.tar.bz2
cd OpenCV-2.4.3/
rm -r 3rdparty/
rm -r android
rm -r doc
rm -r data
rm -r ios
rm -r samples
rm -r apps
rm README
rm -r ../cmake-2.8.10.2/Tests
rm -r ../cmake-2.8.10.2/Testing
rm -r ../cmake-2.8.10.2/Example
rm -r ../cmake-2.8.10.2/Docs
rm -r ../cmake-2.8.10.2/Source
Congratulations you are now half way through the process, But now you have to do something before installing OpenCV. To reduce the build size; we turn off build tests and remove the lines that copy the data, apps and doc folders. Just follow these steps:
  1. Open CMakeList.txt in vi editor using the command vi CMakeList.txt.
  2. Show line numbers using the :set number command.
  3. Go to Lines 155 and 156 and turn off regression and performance test.
  4. Delete Lines 448 to 456.
  5. Save and Quit using the :wq command.
mkdir release
cd release

$OPENSHIFT_DATA_DIR/bin/cmake cmake ../OpenCV-2.4.3 -D BUILD_NEW_PYTHON_SUPPORT=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=$OPENSHIFT_DATA_DIR -D PYTHON_LIBRARY=$OPENSHIFT_DATA_DIR/lib/libpython2.7.so -D CMAKE_INCLUDE_PATH=$OPENSHIFT_DATA_DIR/include/python2.7 -D PYTHON_INCLUDE_DIR=$OPENSHIFT_DATA_DIR/include/python2.7 -D PYTHON_PACKAGES_PATH=$OPENSHIFT_DATA_DIR/lib/python2.7/site-packages -D PYTHON_EXECUTABLE=$OPENSHIFT_DATA_DIR/bin/python2.7 -D WITH_OPENEXR=OFF -D BUILD_DOCS=OFF -DBUILD_SHARED_LIBS=ON ..

make 
make install

Test

Open the python console by typing python2.7 in the command line. import cv2, if you have no error you are good to go but if you have a "NameError: name 'cv2' is not defined" something is wrong.
Python 2.7.3 (default, May 28 2013, 07:58:37) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> A = cv2.imread("A.jpg")
>>> print A
None

Conclusion

This concludes the installation you can now clean up the $OPENSHIFT_TMP folder and install Django or any other web framework you want to use. Hope this was helpful, feel free to share this post and ask question if any. Happy Coding!

Tuesday 16 April 2013

The VMMR Project - Part 1

So you ask what is a VMMR? VMMR is an acronym for Vehicle Make and Model Recognition. A VMMR system utilizes computer vision techniques to determine the Make and Model of a vehicle e.g. BMW X3, FORD Focus etc.

Why VMMR?

Several vehicle monitoring and security systems are based on automated number plate recognition (ANPR), for example, an ANPR systems could be used to prevent illegal entry into a particular location, or to enforce traffic laws or taxes in a city and could also be used to track vehicles in the event of any crime. One of the available ways of circumventing monitoring and security systems that are based on the ANPR is number plate forgery; here the person involved clones an already registered number plate so as to either gain entrance into a facility as the original owner of the number plate or to evade tracking after committing a criminal offence. Because of number plate forgery, ANPR systems are not sufficient to ensure proper security. One way to solve the problem of number plate forgery would be to argument existing security systems that use ANPR with a vehicle make and model recognition (VMMR) system.With such a system, it will be possible to match the vehicle’s plate numbers with the pre-registered make, model, and even colour of the vehicle. This will the make number plate forgery a more difficult task although not completely impossible. Other possible applications of VMMR are tracking and marketing research.

The VMMR system could also provide improved surveillance and tracking in the event of crime. Most times when a crime is committed and the criminal escapes using a vehicle. The police officers collect a description of the criminal and the escape vehicle. These officers now have to review large amounts of surveillance videos to find the criminal using the given vehicle description. With a VMMR system, the amounts of video to be watched could be reduced to the few places where a particular make and model has been discovered thereby speeding up the capture of the criminal.

Another use of VMMR could for marketing research; a company might decide to do a survey of about the vehicles they manufacture or sell. They wanted to find out how many of such vehicles are being used in a region and target their marketing and advertising based on the results of the survey. A VMMR system can provide an automated way of performing such a survey and returning very accurate results. Now you know how important this project is ............sure you do. Now what's this project about?

The Project

I will be implementing a web-based VMMR system using the following:
  1. OpenCv Python Libraries
  2. Django - Python web framework
  3. OpenShift - Free PAAS used to host the system
  4. Other web technologies i.e. JQuery, Ajax..

Conclusion

As you can see the project will contain the works - feature extraction, machine learning etc. I might not release all the source code but will place pointers as to how to get started in each section and improve the articles as I learn stuff. So, I have to get back to work but I will see you soon. Happy coding !