int main (int argc, char **argv) { int i, hist_size = 90; float h_ranges[] = { 0, 180 }; float *ranges[] = { h_ranges }; double max_val; CvSize dst_size; CvPoint max_loc; IplImage *search_img = 0, *tmp_img = 0, *dst_img; IplImage *search_hsv, *tmp_hsv; IplImage *search_planes[3], *tmp_planes[3]; CvHistogram *hist = 0; char *imagename, *templatename; // (1)load a search-area image and a template image respectively imagename = argc > 1 ? argv[1] : "../image/room7.png"; templatename = argc > 2 ? argv[2] : "../image/room7_temp.png"; search_img = cvLoadImage (imagename, CV_LOAD_IMAGE_COLOR); tmp_img = cvLoadImage (templatename, CV_LOAD_IMAGE_COLOR); if(search_img == 0 || tmp_img == 0) return -1; // (2)create color planes buffer to calculate histograms for (i = 0; i < 3; i++) { search_planes[i] = cvCreateImage (cvGetSize (search_img), IPL_DEPTH_8U, 1); tmp_planes[i] = cvCreateImage (cvGetSize (tmp_img), IPL_DEPTH_8U, 1); } // (3)convert the color-space of input images from RGB to HSV search_hsv = cvCreateImage (cvGetSize (search_img), IPL_DEPTH_8U, 3); tmp_hsv = cvCreateImage (cvGetSize (tmp_img), IPL_DEPTH_8U, 3); cvCvtColor(search_img, search_hsv, CV_BGR2HSV); cvCvtColor(tmp_img, tmp_hsv, CV_BGR2HSV); cvCvtPixToPlane(search_hsv, search_planes[0], search_planes[1], search_planes[2], 0); cvCvtPixToPlane(tmp_hsv, tmp_planes[0], tmp_planes[1], tmp_planes[2], 0); // (4)calculate a histogram of hue-plane in a template image hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1); cvCalcHist(&tmp_planes[0], hist, 0, 0); // (5)calculate distance between a template and a patch region in the source image // by comparing their histograms dst_size = cvSize(search_img->width - tmp_img->width + 1, search_img->height - tmp_img->height + 1); dst_img = cvCreateImage (dst_size, IPL_DEPTH_32F, 1); cvCalcBackProjectPatch (&search_planes[0], dst_img, cvGetSize (tmp_img), hist, CV_COMP_CORREL, 1.0); // (6)draw a rectangle indicating template position cvMinMaxLoc(dst_img, NULL, &max_val, NULL, &max_loc, NULL); cvRectangle(search_img, max_loc, cvPoint (max_loc.x + tmp_img->width, max_loc.y + tmp_img->height), CV_RGB (255, 0, 0), 3, 8, 0); // (7)show a matching result image and a probability image, and quit when any key pressed cvNamedWindow ("Match", CV_WINDOW_AUTOSIZE); cvNamedWindow ("Prob", CV_WINDOW_AUTOSIZE); cvShowImage ("Match", search_img); cvShowImage ("Prob", dst_img); cvWaitKey (0); cvDestroyWindow("Image"); cvReleaseImage(&search_img); cvReleaseImage(&dst_img); cvReleaseImage(&tmp_img); cvReleaseImage(&search_hsv); cvReleaseImage(&tmp_hsv); for(i=0; i<3; i++) { cvReleaseImage(&search_planes[i]); cvReleaseImage(&tmp_planes[i]); } return 0; }
void CV_CalcBackProjectPatchTest::run_func(void) { cvCalcBackProjectPatch( images, images[CV_MAX_DIM], patch_size, hist[0], method, factor ); }