I share my experience
OpenCV
Color interpolation in OpenCV
Dec 23rd
I could not find in Internet a function which can return a RGB color value between two colors So I had to do it myself. I hope it will be useful for someone.
CvScalar interpolate(CvScalar c1, CvScalar c2, double value){
if( value < = 0.0 ){ return c1; }
if( value >= 1.0 ){ return c2; }
int red = cvRound((1.0 - value) * c1.val[2] + value * c2.val[2]);
int green = cvRound((1.0 - value) * c1.val[1] + value * c2.val[1]);
int blue = cvRound((1.0 - value) * c1.val[0] + value * c2.val[0]);
return CV_RGB(red, green, blue);
}
Edge orientation
Dec 5th
This is a sample code for getting the edges orientation in an image.
CvMat *filter_x=cvCreateMat(1,3,CV_32FC1); filter_x->data.fl[0]=-1;
filter_x->data.fl[1]=0; filter_x->data.fl[2]=1;
CvMat *filter_y=cvCreateMat(3,1,CV_32FC1); filter_y->data.fl[0]=-1;
filter_y->data.fl[1]=0; filter_y->data.fl[2]=1;
IplImage *img_src=cvLoadImage(“name”,0);
IplImage *img_diff_x=cvCreateImage(cvGetSize(img_src),IPL_DEPTH_32F,1);
IplImage *img_diff_y=cvCreateImage(cvGetSize(img_src),IPL_DEPTH_32F,1);
IplImage *img_32f=cvCreateImage(cvGetSize(img_src),IPL_DEPTH_32F,1);
cvConvert(img_src,img_32f);
cvFilter2D(img_32f,filter_x,img_diff_x);
cvFilter2D(img_32f,filter_y,img_diff_y);
IplImage *magnitude=cvCreateImage(cvGetSize(img_src),IPL_DEPTH_32F,1);
IplImage *orientation=cvCreateImage(cvGetSize(img_src),IPL_DEPTH_32F,1);
cvCartToPolar(img_diff_x, img_diff_y, magnitude, orientation, 1)
Convert Polar image into Cartesian
Nov 26th
This a simple implementation of Polar to Cartesian transformation applied to the image case. It is useful to unroll an omni image to convert it to panoramic image.
imgPol = cvCreateImage(cvSize(2*CV_PI*RadiusMax,RadiusMax-RadiusMin),IPL_DEPTH_8U,1);
cvSet(imgPol,CV_WHITE,NULL);
int x0,y0;
double Radius;
double Angle;
for(int x=1; x < imgPol->width; x++)
{
for(int y=1; y < imgPol->height; y++)
{
Radius = RadiusMin + y;
Angle = 2 * CV_PI * x / imgPol->width;
x0 = cvRound(CenterX + Radius * cos(Angle));
y0 = cvRound(CenterY + Radius * sin(Angle));
cvSet2D(imgPol, y, x, cvGet2D(imgBase,y0,x0));
}
}
cvSaveImage("imgPol.bmp",imgPol);
Closing gaps in image
Nov 18th
This an example on how to use morphological operator in OpenCV to close gaps.
int main(int argc, char* argv[])
{
IplImage *image;
IplImage *dilated_image;
IplImage *eroded_image;
image = cvLoadImage ("triangle.jpg");
dilated_image = cvCloneImage (image);
eroded_image = cvCloneImage (image);
cvNamedWindow ("Original", 1);
cvNamedWindow ("Dilated", 1);
cvNamedWindow ("Eroded", 1);
cvShowImage ("Original", image);
cvDilate (image, dilated_image, 0, 7);
cvShowImage ("Dilated", dilated_image);
cvErode (dilated_image, eroded_image, 0, 6);
cvShowImage ("Eroded", eroded_image);
cvWaitKey ();
cvReleaseImage (&image);
cvDestroyWindow ("Original");
cvReleaseImage (&dilated_image);
cvDestroyWindow ("Dilated");
cvReleaseImage (&eroded_image);
cvDestroyWindow ("Eroded");
return 0;
}
Circle detection
Nov 16th
This a source code for sircle detection.
void findCircles( IplImage* img, CvMemStorage* storage ){
CvSeq* circles;
IplImage* cpy = cvCreateImage(cvGetSize(img),8,1);
int i;
float* circ;
cvCvtColor(img,cpy,CV_RGB2GRAY);
circles =
cvHoughCircles(cpy,storage,CV_HOUGH_GRADIENT,2,cpy->height/4,200,100);
for(i=0;i < circles->total;i++){
CvSeq
circ=(float*)cvGetSeqElem(circles,i);
cvCircle(img,cvPoint(cvRound(circ[0]),cvRound(circ[1])),cvRound(circ[2]),CV_RGB(255,255,255),1,8,0);
}
cvReleaseImage(&cpy);
}
