From: <jl...@us...> - 2008-10-31 21:00:13
|
Revision: 6112 http://personalrobots.svn.sourceforge.net/personalrobots/?rev=6112&view=rev Author: jleibs Date: 2008-10-31 21:00:09 +0000 (Fri, 31 Oct 2008) Log Message: ----------- Checking in improved libcolorcalib and calib_node. Modified Paths: -------------- pkg/trunk/vision/color_calib/calib_node.cpp pkg/trunk/vision/color_calib/colorcalib.h pkg/trunk/vision/color_calib/libcolorcalib.cpp Modified: pkg/trunk/vision/color_calib/calib_node.cpp =================================================================== --- pkg/trunk/vision/color_calib/calib_node.cpp 2008-10-31 20:37:52 UTC (rev 6111) +++ pkg/trunk/vision/color_calib/calib_node.cpp 2008-10-31 21:00:09 UTC (rev 6112) @@ -78,15 +78,18 @@ { string l = image_msg.images[i].label; - CvBridge<std_msgs::Image>* cv_bridge = new CvBridge<std_msgs::Image>(&image_msg.images[i], CvBridge<std_msgs::Image>::CORRECT_BGR | CvBridge<std_msgs::Image>::MAXDEPTH_8U); - if (image_msg.images[i].colorspace == std::string("rgb24")) { + CvBridge<std_msgs::Image>* cv_bridge = new CvBridge<std_msgs::Image>(&image_msg.images[i], CvBridge<std_msgs::Image>::CORRECT_BGR | CvBridge<std_msgs::Image>::MAXDEPTH_8U); IplImage* img; if (cv_bridge->to_cv(&img)) { - find_calib(img, color_cal); + IplImage* img2 = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 3); + + decompand(img, img2); + + find_calib(img2, color_cal, COLOR_CAL_BGR); printf("Color calibration:\n"); for (int i = 0; i < 3; i ++) @@ -98,16 +101,16 @@ printf("\n"); } - IplImage* corrected_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3); + IplImage* corrected_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 3); + cvTransform(img2, corrected_img, color_cal); - cvTransform(img, corrected_img, color_cal); - cvNamedWindow("color_rect", CV_WINDOW_AUTOSIZE); cvShowImage("color_rect", corrected_img); } + + delete cv_bridge; } } - cv_mutex.unlock(); } @@ -134,4 +137,3 @@ ros::fini(); return 0; } - Modified: pkg/trunk/vision/color_calib/colorcalib.h =================================================================== --- pkg/trunk/vision/color_calib/colorcalib.h 2008-10-31 20:37:52 UTC (rev 6111) +++ pkg/trunk/vision/color_calib/colorcalib.h 2008-10-31 21:00:09 UTC (rev 6112) @@ -37,6 +37,12 @@ #include "opencv/cxcore.h" -bool find_calib(IplImage* img, CvMat* m); +static const uint32_t COLOR_CAL_BGR = 1; +static const uint32_t COLOR_CAL_FLOAT = 1; +float srgb2lrgb(float x); +float lrgb2srgb(float x); +void decompand(IplImage* src, IplImage* dst); +bool find_calib(IplImage* img, CvMat* m, int flags=0); + #endif Modified: pkg/trunk/vision/color_calib/libcolorcalib.cpp =================================================================== --- pkg/trunk/vision/color_calib/libcolorcalib.cpp 2008-10-31 20:37:52 UTC (rev 6111) +++ pkg/trunk/vision/color_calib/libcolorcalib.cpp 2008-10-31 21:00:09 UTC (rev 6112) @@ -41,6 +41,7 @@ #include "opencv/highgui.h" IplImage* g_img; +IplImage* g_disp_img; CvMat* g_real_corners; CvMat* g_meas_corners; @@ -49,69 +50,119 @@ CvMat* g_real_colors; CvMat* g_meas_colors; +CvMat* g_reproj_colors; CvMat* g_hom; CvMat* g_color_cal; int g_ind; -float g_srgb_colors_dat[] = { 115, 82, 68, - 194, 150, 130, - 98, 122, 157, - 87, 108, 67, - 133, 128, 177, - 103, 189, 170, - 214, 126, 44, - 80, 91, 166, - 193, 90, 99, - 94, 60, 108, - 157, 188, 64, - 224, 163, 64, - 56, 61, 150, - 70, 148, 73, - 175, 54, 60, - 231, 199, 31, - 187, 86, 149, - 8, 133, 161, - 243, 243, 242, - 200, 200, 200, - 160, 160, 160, - 122, 122, 121, - 85, 85, 85, - 52, 52, 52}; +float g_srgb_colors_dat[] = { 115.0/255.0, 82.0/255.0, 68.0/255.0, + 194.0/255.0, 150.0/255.0, 130.0/255.0, + 98.0/255.0, 122.0/255.0, 157.0/255.0, + 87.0/255.0, 108.0/255.0, 67.0/255.0, + 133.0/255.0, 128.0/255.0, 177.0/255.0, + 103.0/255.0, 189.0/255.0, 170.0/255.0, + 214.0/255.0, 126.0/255.0, 44.0/255.0, + 80.0/255.0, 91.0/255.0, 166.0/255.0, + 193.0/255.0, 90.0/255.0, 99.0/255.0, + 94.0/255.0, 60.0/255.0, 108.0/255.0, + 157.0/255.0, 188.0/255.0, 64.0/255.0, + 224.0/255.0, 163.0/255.0, 64.0/255.0, + 56.0/255.0, 61.0/255.0, 150.0/255.0, + 70.0/255.0, 148.0/255.0, 73.0/255.0, + 175.0/255.0, 54.0/255.0, 60.0/255.0, + 231.0/255.0, 199.0/255.0, 31.0/255.0, + 187.0/255.0, 86.0/255.0, 149.0/255.0, + 8.0/255.0, 133.0/255.0, 161.0/255.0, + 243.0/255.0, 243.0/255.0, 242.0/255.0, + 200.0/255.0, 200.0/255.0, 200.0/255.0, + 160.0/255.0, 160.0/255.0, 160.0/255.0, + 122.0/255.0, 122.0/255.0, 121.0/255.0, + 85.0/255.0, 85.0/255.0, 85.0/255.0, + 52.0/255.0, 52.0/255.0, 52.0/255.0}; float srgb2lrgb(float x) { - float k = x / 255.0; - if (k < 0.04045) + if (x < 0.04045) { - k = k/12.92; + x = x/12.92; } else { - k = pow( (k + 0.055)/(1.055), 2.4 ); + x = pow( (x + 0.055)/(1.055), 2.4 ); } - return k*255.0; + return x; } float lrgb2srgb(float x) { - float k = x / 255.0; - if (k < 0.0031308) + if (x < 0.0031308) { - k = k*12.92; + x = x*12.92; } else { - k = (1.055)*pow(k, 1.0/2.4) - 0.055; + x = (1.055)*pow(x, 1.0/2.4) - 0.055; } - return k*255.0; + return x; } +void decompand(IplImage* src, IplImage* dst) +{ + + // TODO: type checking that src is type 8U or else "companding" makes less sense + + int channels = dst->nChannels; + int depth = dst->depth; + + static float compandmap[1024]; + static bool has_map = false; + + if (!has_map) + { + int compandinc = 1; + int j = 0; + int i = 0; + while (i < 4096) + { + compandmap[j] = float(i)/4096.0; + + if (i > 2047) + compandinc = 8; + else if (i > 511) + compandinc = 4; + else if (i > 255) + compandinc = 2; + else + compandinc = 1; + + i += compandinc; + j += 1; + } + has_map = true; + } + + if (depth == IPL_DEPTH_32F) + { + for (int i = 0; i < src->height; i++) + for (int j = 0; j < src->width; j++) + for (int k = 0; k < channels; k++) + ((float *)(dst->imageData + i*dst->widthStep))[j*dst->nChannels + k] = + compandmap[((uchar *)(src->imageData + i*src->widthStep))[j*src->nChannels + k] << 2]; + } else { + for (int i = 0; i < src->height; i++) + for (int j = 0; j < src->width; j++) + for (int k = 0; k < channels; k++) + ((uchar *)(dst->imageData + i*dst->widthStep))[j*dst->nChannels + k] = + compandmap[((uchar *)(src->imageData + i*src->widthStep))[j*src->nChannels + k] << 2]*255; + } +} + //Mouse event handler void on_mouse(int event, int x, int y, int flags, void *params) { switch(event) { case CV_EVENT_LBUTTONDOWN: - cvCircle(g_img, cvPoint(x,y), 5, cvScalar(0,0,255)); + cvCircle(g_disp_img, cvPoint(x,y), 5, cvScalar(0,0,255)); // For first 4 clicks, set measured corners: if (g_ind < 4) { @@ -131,12 +182,9 @@ for (int i = 0; i < g_colors_pos->rows; i++) { - CvPoint* p[1]; CvPoint poly[4]; - p[0] = &(poly[0]); - int n[] = {4}; - int minx=10000; - int miny=10000; + int minx=1000000; + int miny=1000000; int maxx=0; int maxy=0; @@ -158,8 +206,9 @@ IplImage* mask = cvCreateImage(cvGetSize(g_img), IPL_DEPTH_8U, 1); cvFillConvexPoly(mask, poly, 4, cvScalar(1)); + int cnt = 0; CvScalar color = cvScalar(0,0,0); - int cnt = 0; + // CvScalar color = cvAvg(g_img, mask); for( int u = minx; u < maxx; u++) for (int v = miny; v < maxy; v++) @@ -176,7 +225,7 @@ color.val[1] /= cnt; color.val[2] /= cnt; - cvDrawPolyLine(g_img, p, n, 1, 1, cvScalar(255,0,0)); + cvReleaseImage(&mask); cvmSet(g_meas_colors, i, 0, color.val[0]); cvmSet(g_meas_colors, i, 1, color.val[1]); @@ -184,27 +233,57 @@ } - cvShowImage("macbeth image", g_img); - cvReleaseMat(&reproj); cvSolve(g_meas_colors, g_real_colors, g_color_cal, CV_SVD); + cvMatMul(g_meas_colors, g_color_cal, g_reproj_colors); + + for (int k = 0; k < 24; k++) + { + printf("%d) Meas: %f %f %f\n Reproj: %f %f %f\n Real: %f %f %f\n", + k, + cvmGet(g_meas_colors,k,0), + cvmGet(g_meas_colors,k,1), + cvmGet(g_meas_colors,k,2), + cvmGet(g_reproj_colors,k,0), + cvmGet(g_reproj_colors,k,1), + cvmGet(g_reproj_colors,k,2), + cvmGet(g_real_colors,k,0), + cvmGet(g_real_colors,k,1), + cvmGet(g_real_colors,k,2)); + } + cvTranspose(g_color_cal, g_color_cal); g_ind++; } - cvShowImage("macbeth image", g_img); + cvShowImage("macbeth image", g_disp_img); break; } +} +bool find_calib(IplImage* img, CvMat* mat, int flags) +{ -} + bool use_bgr = flags & COLOR_CAL_BGR; + bool use_float = (img->depth == IPL_DEPTH_32F); -bool find_calib(IplImage* img, CvMat* mat) -{ + float mult; + if (use_float) + mult = 1; + else + mult = 255; + g_img = cvCloneImage(img); + g_disp_img = cvCloneImage(g_img); + if (!use_bgr) + cvCvtColor(g_disp_img, g_disp_img, CV_RGB2BGR); + + CvScalar a = cvAvg(g_img); + printf("Avg value of g: %f %f %f\n", a.val[0], a.val[1], a.val[2]); + if (g_img && mat) { //Allocate matrices @@ -225,30 +304,36 @@ cvSet2D(g_colors_pos, i, 3, cvScalar(float(i%6 + .25), float(i/6 + .75))); } - g_real_colors = cvCreateMatHeader( 24, 3, CV_32FC1); - cvSetData( g_real_colors, g_srgb_colors_dat, 3*sizeof(float)); + g_real_colors = cvCreateMat( 24, 3, CV_32FC1); - // Swap our srgb colors to lbgr colors for opencv + // Set to lbgr colors for opencv for (int i = 0; i < 24; i++) { - float r = srgb2lrgb(cvmGet(g_real_colors, i, 0)); - float g = srgb2lrgb(cvmGet(g_real_colors, i, 1)); - float b = srgb2lrgb(cvmGet(g_real_colors, i, 2)); - cvmSet(g_real_colors, i, 0, b); - cvmSet(g_real_colors, i, 1, g); - cvmSet(g_real_colors, i, 2, r); + float r = srgb2lrgb(g_srgb_colors_dat[3*i + 0])*mult; + float g = srgb2lrgb(g_srgb_colors_dat[3*i + 1])*mult; + float b = srgb2lrgb(g_srgb_colors_dat[3*i + 2])*mult; + if (use_bgr) + { + cvmSet(g_real_colors, i, 0, b); + cvmSet(g_real_colors, i, 1, g); + cvmSet(g_real_colors, i, 2, r); + } else { + cvmSet(g_real_colors, i, 0, r); + cvmSet(g_real_colors, i, 1, g); + cvmSet(g_real_colors, i, 2, b); + } } g_meas_colors = cvCreateMat( 24, 3, CV_32FC1); + g_reproj_colors = cvCreateMat( 24, 3, CV_32FC1); g_color_cal = mat; // Create display cvNamedWindow("macbeth image", CV_WINDOW_AUTOSIZE); cvSetMouseCallback("macbeth image", on_mouse, 0); - cvShowImage("macbeth image", g_img); + cvShowImage("macbeth image", g_disp_img); - while (g_ind < 5) { cvWaitKey(3); @@ -258,10 +343,12 @@ cvDestroyWindow("macbeth image"); cvReleaseImage(&g_img); + cvReleaseImage(&g_disp_img); cvReleaseMat(&g_real_corners); cvReleaseMat(&g_meas_corners); cvReleaseMat(&g_real_colors); cvReleaseMat(&g_meas_colors); + cvReleaseMat(&g_reproj_colors); cvReleaseMat(&g_colors_pos); cvReleaseMat(&g_hom); @@ -269,5 +356,4 @@ } else { return false; } - } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |