added computeNMChannels helper function to compute the diferent channels to be processed independently in the N&M algorithm.
This commit is contained in:
parent
77a2529eb7
commit
e8d3732aaf
@ -193,5 +193,28 @@ CV_EXPORTS Ptr<ERFilter> createERFilterNM1(const Ptr<ERFilter::Callback>& cb = P
|
|||||||
CV_EXPORTS Ptr<ERFilter> createERFilterNM2(const Ptr<ERFilter::Callback>& cb = Ptr<ERFilter::Callback>(),
|
CV_EXPORTS Ptr<ERFilter> createERFilterNM2(const Ptr<ERFilter::Callback>& cb = Ptr<ERFilter::Callback>(),
|
||||||
float minProbability = 0.3);
|
float minProbability = 0.3);
|
||||||
|
|
||||||
|
|
||||||
|
// computeNMChannels operation modes
|
||||||
|
enum { ERFILTER_NM_RGBLGrad = 0,
|
||||||
|
ERFILTER_NM_IHSGrad = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Compute the different channels to be processed independently in the N&M algorithm
|
||||||
|
Neumann L., Matas J.: Real-Time Scene Text Localization and Recognition, CVPR 2012
|
||||||
|
|
||||||
|
In N&M algorithm, the combination of intensity (I), hue (H), saturation (S), and gradient
|
||||||
|
magnitude channels (Grad) are used in order to obtain high localization recall.
|
||||||
|
This implementation also provides an alternative combination of red (R), green (G), blue (B),
|
||||||
|
lightness (L), and gradient magnitude (Grad).
|
||||||
|
|
||||||
|
\param _src Source image. Must be RGB CV_8UC3.
|
||||||
|
\param _channels Output vector<Mat> where computed channels are stored.
|
||||||
|
\param _mode Mode of operation. Currently the only available options are
|
||||||
|
ERFILTER_NM_RGBLGrad (by default) and ERFILTER_NM_IHSGrad.
|
||||||
|
|
||||||
|
*/
|
||||||
|
CV_EXPORTS void computeNMChannels(InputArray _src, OutputArrayOfArrays _channels, int _mode = ERFILTER_NM_RGBLGrad);
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif // _OPENCV_ERFILTER_HPP_
|
#endif // _OPENCV_ERFILTER_HPP_
|
||||||
|
@ -1141,4 +1141,120 @@ Ptr<ERFilter> createERFilterNM2(const Ptr<ERFilter::Callback>& cb, float minProb
|
|||||||
filter->setMinProbability(minProbability);
|
filter->setMinProbability(minProbability);
|
||||||
return (Ptr<ERFilter>)filter;
|
return (Ptr<ERFilter>)filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------*/
|
||||||
|
/* -------------------------------- Compute Channels NM -------------------------------*/
|
||||||
|
/* ------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
void get_gradient_magnitude(Mat& _grey_img, Mat& _gradient_magnitude);
|
||||||
|
|
||||||
|
void get_gradient_magnitude(Mat& _grey_img, Mat& _gradient_magnitude)
|
||||||
|
{
|
||||||
|
Mat C = Mat_<double>(_grey_img);
|
||||||
|
|
||||||
|
Mat kernel = (Mat_<double>(1,3) << -1,0,1);
|
||||||
|
Mat grad_x;
|
||||||
|
filter2D(C, grad_x, -1, kernel, Point(-1,-1), 0, BORDER_DEFAULT);
|
||||||
|
|
||||||
|
Mat kernel2 = (Mat_<double>(3,1) << -1,0,1);
|
||||||
|
Mat grad_y;
|
||||||
|
filter2D(C, grad_y, -1, kernel2, Point(-1,-1), 0, BORDER_DEFAULT);
|
||||||
|
|
||||||
|
for(int i=0; i<grad_x.rows; i++)
|
||||||
|
for(int j=0; j<grad_x.cols; j++)
|
||||||
|
_gradient_magnitude.at<double>(i,j) = sqrt(pow(grad_x.at<double>(i,j),2)+pow(grad_y.at<double>(i,j),2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Compute the diferent channels to be processed independently in the N&M algorithm
|
||||||
|
Neumann L., Matas J.: Real-Time Scene Text Localization and Recognition, CVPR 2012
|
||||||
|
|
||||||
|
In N&M algorithm, the combination of intensity (I), hue (H), saturation (S), and gradient
|
||||||
|
magnitude channels (Grad) are used in order to obatin high localization recall.
|
||||||
|
This implementation also the alternative combination of red (R), grren (G), blue (B),
|
||||||
|
lightness (L), and gradient magnitude (Grad).
|
||||||
|
|
||||||
|
\param _src Source image. Must be RGB CV_8UC3.
|
||||||
|
\param _channels Output vector<Mat> where computed channels are stored.
|
||||||
|
\param _mode Mode of operation. Currently the only available options are
|
||||||
|
ERFILTER_NM_RGBLGrad and ERFILTER_NM_IHSGrad.
|
||||||
|
|
||||||
|
*/
|
||||||
|
void computeNMChannels(InputArray _src, OutputArrayOfArrays _channels, int _mode)
|
||||||
|
{
|
||||||
|
|
||||||
|
CV_Assert( ( _mode == ERFILTER_NM_RGBLGrad ) || ( _mode == ERFILTER_NM_IHSGrad ) );
|
||||||
|
|
||||||
|
Mat src = _src.getMat();
|
||||||
|
if( src.empty() )
|
||||||
|
{
|
||||||
|
_channels.release();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// assert RGB image
|
||||||
|
CV_Assert(src.type() == CV_8UC3);
|
||||||
|
|
||||||
|
if (_mode == ERFILTER_NM_IHSGrad)
|
||||||
|
{
|
||||||
|
_channels.create( 4, 1, src.depth());
|
||||||
|
|
||||||
|
Mat hsv;
|
||||||
|
cvtColor(src, hsv, COLOR_RGB2HSV);
|
||||||
|
vector<Mat> channelsHSV;
|
||||||
|
split(hsv, channelsHSV);
|
||||||
|
|
||||||
|
for (int i = 0; i < src.channels(); i++)
|
||||||
|
{
|
||||||
|
_channels.create(src.rows, src.cols, CV_8UC1, i);
|
||||||
|
Mat channel = _channels.getMat(i);
|
||||||
|
channelsHSV.at(i).copyTo(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat grey;
|
||||||
|
cvtColor(src, grey, COLOR_RGB2GRAY);
|
||||||
|
Mat gradient_magnitude = Mat_<double>(grey.size());
|
||||||
|
get_gradient_magnitude( grey, gradient_magnitude);
|
||||||
|
gradient_magnitude.convertTo(gradient_magnitude, CV_8UC1);
|
||||||
|
|
||||||
|
_channels.create(src.rows, src.cols, CV_8UC1, 3);
|
||||||
|
Mat channelGrad = _channels.getMat(3);
|
||||||
|
gradient_magnitude.copyTo(channelGrad);
|
||||||
|
|
||||||
|
} else if (_mode == ERFILTER_NM_RGBLGrad) {
|
||||||
|
|
||||||
|
_channels.create( 5, 1, src.depth());
|
||||||
|
|
||||||
|
vector<Mat> channelsRGB;
|
||||||
|
split(src, channelsRGB);
|
||||||
|
for (int i = 0; i < src.channels(); i++)
|
||||||
|
{
|
||||||
|
_channels.create(src.rows, src.cols, CV_8UC1, i);
|
||||||
|
Mat channel = _channels.getMat(i);
|
||||||
|
channelsRGB.at(i).copyTo(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat hls;
|
||||||
|
cvtColor(src, hls, COLOR_RGB2HLS);
|
||||||
|
vector<Mat> channelsHLS;
|
||||||
|
split(hls, channelsHLS);
|
||||||
|
|
||||||
|
_channels.create(src.rows, src.cols, CV_8UC1, 3);
|
||||||
|
Mat channelL = _channels.getMat(3);
|
||||||
|
channelsHLS.at(1).copyTo(channelL);
|
||||||
|
|
||||||
|
Mat grey;
|
||||||
|
cvtColor(src, grey, COLOR_RGB2GRAY);
|
||||||
|
Mat gradient_magnitude = Mat_<double>(grey.size());
|
||||||
|
get_gradient_magnitude( grey, gradient_magnitude);
|
||||||
|
gradient_magnitude.convertTo(gradient_magnitude, CV_8UC1);
|
||||||
|
|
||||||
|
_channels.create(src.rows, src.cols, CV_8UC1, 4);
|
||||||
|
Mat channelGrad = _channels.getMat(4);
|
||||||
|
gradient_magnitude.copyTo(channelGrad);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user