// // Created by Jack Yu on 04/04/2017. // #include namespace util{ template void swap ( T& a, T& b ) { T c(a); a=b; b=c; } template T min(T& a,T& b ) { return a>b?b:a; } cv::Mat cropFromImage(const cv::Mat &image,cv::Rect rect){ int w = image.cols-1; int h = image.rows-1; rect.x = std::max(rect.x,0); rect.y = std::max(rect.y,0); rect.height = std::min(rect.height,h-rect.y); rect.width = std::min(rect.width,w-rect.x); cv::Mat temp(rect.size(), image.type()); cv::Mat cropped; temp = image(rect); temp.copyTo(cropped); return cropped; } cv::Mat cropBox2dFromImage(const cv::Mat &image,cv::RotatedRect rect) { cv::Mat M, rotated, cropped; float angle = rect.angle; cv::Size rect_size(rect.size.width,rect.size.height); if (rect.angle < -45.) { angle += 90.0; swap(rect_size.width, rect_size.height); } M = cv::getRotationMatrix2D(rect.center, angle, 1.0); cv::warpAffine(image, rotated, M, image.size(), cv::INTER_CUBIC); cv::getRectSubPix(rotated, rect_size, rect.center, cropped); return cropped; } cv::Mat calcHist(const cv::Mat &image) { cv::Mat hsv; std::vector hsv_planes; cv::cvtColor(image,hsv,cv::COLOR_BGR2HSV); cv::split(hsv,hsv_planes); cv::Mat hist; int histSize = 256; float range[] = {0,255}; const float* histRange = {range}; cv::calcHist( &hsv_planes[0], 1, 0, cv::Mat(), hist, 1, &histSize, &histRange,true, true); return hist; } float computeSimilir(const cv::Mat &A,const cv::Mat &B) { cv::Mat histA,histB; histA = calcHist(A); histB = calcHist(B); return cv::compareHist(histA,histB,CV_COMP_CORREL); } }//namespace util