Feature Detection Dataset
I was trying to test some feature detection code and wanted to test it on the famous Graffiti dataset used in many of the papers like SIFT. After searching recklessly I reached the location, it is at INRIA.
http://lear.inrialpes.fr/people/mikolajczyk/Database/index.html
This page has about 8 sequences of images to test different Feature Detection in different conditions. They name it as FEATURE DETECTOR EVALUATION SEQUENCES.
Simple Selecting Points in 2 images using Matlab GUIDE
Following is the program that lets you load two images and click points in both of them. It does not store the correspondence however because it stores points in the array so if you keep the order same in the both images it could be used for the point correspondence.
Use the guide command to make it them you can work on the each component by clicking on each component and selecting callback function.
function varargout = momentsGUI(varargin)
% MOMENTSGUI M-file for momentsGUI.fig
% MOMENTSGUI, by itself, creates a new MOMENTSGUI or raises the existing
% singleton*.
%
% H = MOMENTSGUI returns the handle to a new MOMENTSGUI or the handle to
% the existing singleton*.
%
% MOMENTSGUI('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in MOMENTSGUI.M with the given input arguments.
%
% MOMENTSGUI('Property','Value',...) creates a new MOMENTSGUI or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before momentsGUI_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to momentsGUI_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help momentsGUI
% Last Modified by GUIDE v2.5 09-Jan-2010 14:30:50
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @momentsGUI_OpeningFcn, ...
'gui_OutputFcn', @momentsGUI_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before momentsGUI is made visible.
function momentsGUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to momentsGUI (see VARARGIN)
% Choose default command line output for momentsGUI
handles.output = hObject;
handles.selected = 0;
handles.point1 = [];
handles.point2 = [];
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes momentsGUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = momentsGUI_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[FileName,PathName,FilterIndex] = uigetfile('*.*');
img1 = imread([PathName FileName]);
%img1 = imread('carstick.bmp');
axes(handles.axes1);
imshow(img1);
handles.img1 = img1;
handles.size1 = size(img1);
% Update handles structure
guidata(hObject, handles);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[FileName,PathName,FilterIndex] = uigetfile('*.*');
img2 = imread([PathName FileName]);
axes(handles.axes2);
imshow(img2);
handles.img2 = img2;
handles.size2 = size(img2);
% Update handles structure
guidata(hObject, handles);
%ginput(2)
% --- Executes on button press in selectImg1PtsPushButton.
function selectImg1PtsPushButton_Callback(hObject, eventdata, handles)
% hObject handle to selectImg1PtsPushButton (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.axes1);
pt = ginput(1);
pt=fliplr(pt);
if (sum(pt <=handles.size1(1:2))*sum(pt>[0 0]))
handles.point1 = [handles.point1 ; pt];
guidata(hObject, handles);
handles.point1
pt = round(pt);
axes(handles.axes1);
hold on;
plot(pt(2), pt(1), 'r*');
end
% --- Executes on button press in selectPointImg2.
function selectPointImg2_Callback(hObject, eventdata, handles)
% hObject handle to selectPointImg2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.axes2);
pt = ginput(1);
pt=fliplr(pt);
if (sum(pt <=handles.size2(1:2))*sum(pt>[0 0]))
handles.point2 = [handles.point2 ; pt];
guidata(hObject, handles);
handles.point1
pt = round(pt);
axes(handles.axes2);
hold on;
plot(pt(2), pt(1), 'r*');
end
Working with 3D matrix in Matlab
To visualize the 3D matrix just consider that them as stack of images or layers.
{There is one more very important way, that is third dimension representing the feature vector’s length}
So a(:, :, i) = all elements in the layer i, so changing i will give you next image.
where a(r,c, i) will move in the image.
a = []; a(:,1,:) = [111 112 113 114 ; 121 122 123 124 ; 131 132 133 134]; a(:,2,:) = [211 212 213 214 ; 221 222 223 224 ; 231 232 233 234]; a(:,3,:) = [311 312 113 114 ; 321 322 323 324 ; 331 332 333 334]; a(:,4,:) = [411 412 113 114 ; 421 422 423 424 ; 431 432 433 434]; a(:,5,:)= [511 512 513 514 ; 521 522 523 524 ; 531 532 533 534];
Will make the 3D matrix ‘a’
size(a)
ans =
3 5 4
That is there are 4 images and each image is of 3 rows and 5 cols.
But let’s Say you want to represent 3rd dimension as the feature vector so each a(r,c, : ) represents a feature vector.
Now let’s say you want to make a 3D matrix from one feature vector.
vt = squeeze([a( 2,1, : ) ] );
vt = vt(:)';
%//make it into 2 by 3 by length(feature) matrix
%//repmat will repeat this matrix and make a 6 row matrix
%//the reshape picks the elements from the 1st col, 1st row and start moving downward in the row and so on
%//therefore each time it will meet same element as it moves down the row and fills our first image
tempT = (reshape(repmat(vt, 2*3,1), 2, 3, length(vt)));
size(tempT)
ans =
2 3 4
Matlab Memory management
Oh it turns out that the matlab does not copy the data while passing it to the function if the function is not changing the values.
Which is big saving.
http://blogs.mathworks.com/loren/2006/05/10/memory-management-for-functions-and-variables/#1
Running Variance
Just in mid of the code wanted to find the Running Variance, just as habit typed and found not so good links.
1/N*[sum(i=1:N-1, Xi*Xi') + X*X'] – (1/N^2)*[ sum(i=1:(N-1), Xi) + X][ sum(i=1:(N-1), Xi) + X]‘
Matlab code for calculating the running Variance is as follow
%updating Mean newMean = (newMean*(N-1) + X)/N; sumOfSq = sumOfSq*(N-1) + X*X'; covMat = (1/N)*sumOfSQ - newMean*newMean'
Externally there are few links that are worth reading
- Accurately computing running variance
- From Google Answers, someone gave even the posted Java Code ; Simple and clear that could be easily read by any one knowing any programming language
Using Many Colors in the Matlab
While using the ‘plot’ function you end up using only small number of colors. I searched online to see if there are any solutions
One is given by http://blogs.mathworks.com/pick/2008/08/15/colors-for-your-multi-line-plots/
It discusses “varycolor” file. Which is very nice for generating many colors on the run.
However I found that for plotting of the poitns and data following is much distinguishable.
It is 72 element array.
clr = [ '.r';'.b'; '.g'; '.c';'.m'; '.y';...
'*r';'*b'; '*g'; '*c';'*m'; '*y';...
'xr';'xb'; 'xg'; 'xc';'xm'; 'xy';...
'+r';'+b'; '+g'; '+c';'+m'; '+y';...
'or';'ob'; 'og'; 'oc';'om'; 'oy';...
'dr';'db'; 'dg'; 'dc';'dm'; 'dy';...
'sr';'sb'; 'sg'; 'sc';'sm'; 'sy';...
'pr';'pb'; 'pg'; 'pc';'pm'; 'py';...
'hr';'hb'; 'hg'; 'hc';'hm'; 'hy';...
'vr';'vb'; 'vg'; 'vc';'vm'; 'vy';...
'>r';'>b'; '>g'; '>c';'>m'; '>y';...
'.k';'xk'; '*k'; '+k';'ok'; 'dk';...
];
Matlab Efficient coding
The interpreter nature of Matlab keeps me always looking for coding it fast and efficient way, squeezing as much work as we can squeeze from single statement.
Searching for something about Matlab found following blog entry
http://omar-sabih.blogspot.com/2009/05/matlab-tryin-to-code-smarter.html
It’s much cleaner and better presented version is present at http://www.sajidmc.net/bn/2009/05/efficient-matlab-coding/
Although I also have my Matlab page http://whatevericode.wordpress.com/matlab/ but it much less rigorous
SVMToolboxes
I have till now used 2 SVM toolboxes details about them are as follow.
1) SVM Tool Box for matlab
http://theoval.sys.uea.ac.uk/svm/toolbox/
Here we can use the precalculated kernels
NOTE: while compiling it is using the
mex smosvctrain.cpp InfCache.cpp LrrCache.cpp SmoTutor.cpp -lm
The -lm option does not exist atleast in the Matlab 7.0 mex function. So remove it.
While compiling LrrCache.cpp, the compiler is giving a stupid error about the ambiguous call to floor function at line 151. Just type cast it to (long double).
2) Gun’s SVM toolbox
http://www.isis.ecs.soton.ac.uk/resources/svminfo
NOTE: Labels should be -1,1
The data is in row order i.e. each row is a feature vector.
Labels Have to be in column vector.
stl Sort in C++; simple code for sorting the array of structures
Simple Code that shows how to use the C++ STL function sort()
<blockquote>
#include <iostream>
#include <algorithm>
using namespace std;
struct Numb{
double num;
int pos1;
bool operator <(const Numb &n1){
return num < n1.num;
};
};
////////////////////////////////
void main(void){
Numb numb[10];
for(int i=0; i < 10; i++){
numb[i].num = rand();
numb[i].pos1 = i;
}
cout << endl << "---------" <<endl;
for(int i=0; i < 10; i++){
cout << " " << "(" << numb[i].pos1 << ") " << numb[i].num;
}
cout << endl << "---------" <<endl;
std::sort( numb, numb+10);
cout << endl << "---------" <<endl;
for(int i=0; i < 10; i++){
cout << " " << "(" << numb[i].pos1 << ") " << numb[i].num;
}
cout << endl << "---------" <<endl;
}
OpenCv; Small Code using Erode and Dilate
Small Code that reads pbm image, convert it into 1 channel image. Erodes it, dilates it and shows them
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>
#include <iostream>#include "BlobResult.h"
#include "blob.h"
#ifdef _EiC
#define WIN32
#endif
using namespace std;
void main(void){
IplImage *inputImage = cvLoadImage( "0584.pbm", 1 );
IplImage *gray = cvCreateImage( cvSize(inputImage->width,inputImage->height), 8, 1 );
cvCvtColor( inputImage, gray, CV_BGR2GRAY );
IplImage*img = inputImage;
inputImage = gray;
::cvReleaseImage(&img);
cvNamedWindow( "orig", 1 );
cvShowImage( "orig", inputImage );
IplImage *outputImage;
IplImage *outputImage2;
outputImage = cvCreateImage( cvSize( inputImage->width, inputImage->height ), IPL_DEPTH_8U, 1 );
outputImage2 = cvCreateImage( cvSize( inputImage->width, inputImage->height ), IPL_DEPTH_8U, 1 );
cvErode(inputImage, outputImage, 0, 1);
cvNamedWindow( "erode", 1 );
cvShowImage( "erode", outputImage );
cvDilate(outputImage, outputImage2, 0, 2);
cvNamedWindow( "dilate", 1 );
cvShowImage( "dilate", outputImage2 );
cvReleaseImage(&outputImage);
cvReleaseImage(&outputImage2);
cvWaitKey();
return;
}>