OpenCV

Color interpolation in OpenCV

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);
}

Click to continue reading “Color interpolation in OpenCV”

Edge orientation

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)

Click to continue reading “Edge orientation”

Convert Polar image into Cartesian

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

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

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);

}