You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.9 KiB
C++
68 lines
1.9 KiB
C++
//
|
|
// Created by Jack Yu on 04/04/2017.
|
|
//
|
|
|
|
#include <opencv2/opencv.hpp>
|
|
namespace util{
|
|
template <class T> void swap ( T& a, T& b )
|
|
{
|
|
T c(a); a=b; b=c;
|
|
}
|
|
template <class T> 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<cv::Mat> 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
|