parent
56ea364cb2
commit
8066cee8a0
1 changed files with 137 additions and 0 deletions
@ -0,0 +1,137 @@ |
|||||||
|
#include "acffeature.hpp" |
||||||
|
|
||||||
|
using std::vector; |
||||||
|
|
||||||
|
#include <algorithm> |
||||||
|
using std::min; |
||||||
|
|
||||||
|
#include <opencv2/imgproc.hpp> |
||||||
|
#include <opencv2/imgproc/types_c.h> |
||||||
|
|
||||||
|
namespace cv |
||||||
|
{ |
||||||
|
namespace adas |
||||||
|
{ |
||||||
|
|
||||||
|
ACFFeatureEvaluator::ACFFeatureEvaluator(const vector<Point3i>& features): |
||||||
|
features_(features), channels_(), position_() |
||||||
|
{ |
||||||
|
} |
||||||
|
int ACFFeatureEvaluator::evaluate(size_t feature_ind) const |
||||||
|
{ |
||||||
|
/* Assume there are 10 channels */ |
||||||
|
CV_Assert(channels_.size() == 10); |
||||||
|
CV_Assert(feature_ind < features_.size()); |
||||||
|
|
||||||
|
Point3i feature = features_.at(feature_ind); |
||||||
|
int x = feature.x; |
||||||
|
int y = feature.y; |
||||||
|
int n = feature.z; |
||||||
|
return channels_[n].at<int>(y, x); |
||||||
|
} |
||||||
|
|
||||||
|
void ACFFeatureEvaluator::setChannels(cv::InputArrayOfArrays channels) |
||||||
|
{ |
||||||
|
channels_.clear(); |
||||||
|
vector<Mat> ch; |
||||||
|
channels.getMatVector(ch); |
||||||
|
for( size_t i = 0; i < ch.size(); ++i ) |
||||||
|
{ |
||||||
|
const Mat &channel = ch[i]; |
||||||
|
Mat_<int> acf_channel(channel.rows / 4, channel.cols / 4); |
||||||
|
for( int row = 0; row < channel.rows; row += 4 ) |
||||||
|
{ |
||||||
|
for( int col = 0; col < channel.cols; col += 4 ) |
||||||
|
{ |
||||||
|
int sum = 0; |
||||||
|
for( int cell_row = row; cell_row < row + 4; ++cell_row ) |
||||||
|
for( int cell_col = col; cell_col < col + 4; ++cell_col ) |
||||||
|
sum += channel.at<float>(cell_row, cell_col); |
||||||
|
|
||||||
|
acf_channel(row / 4, col / 4) = sum; |
||||||
|
} |
||||||
|
} |
||||||
|
channels_.push_back(acf_channel); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void ACFFeatureEvaluator::setPosition(Size position) |
||||||
|
{ |
||||||
|
position_ = position; |
||||||
|
} |
||||||
|
|
||||||
|
void ACFFeatureEvaluator::evaluateAll(OutputArray feature_values) const |
||||||
|
{ |
||||||
|
Mat_<int> feature_vals(1, features_.size()); |
||||||
|
for( size_t i = 0; i < features_.size(); ++i ) |
||||||
|
{ |
||||||
|
feature_vals(0, i) = evaluate(i); |
||||||
|
} |
||||||
|
feature_values.setTo(feature_vals); |
||||||
|
} |
||||||
|
|
||||||
|
vector<Point3i> generateFeatures(Size window_size, int count) |
||||||
|
{ |
||||||
|
CV_Assert(count > 0); |
||||||
|
int cur_count = 0; |
||||||
|
int max_count = window_size.width * window_size.height / 16; |
||||||
|
count = min(count, max_count); |
||||||
|
vector<Point3i> features; |
||||||
|
for( int x = 0; x < window_size.width / 4; ++x ) |
||||||
|
{ |
||||||
|
for( int y = 0; y < window_size.height / 4; ++y ) |
||||||
|
{ |
||||||
|
/* Assume there are 10 channel types */ |
||||||
|
for( int n = 0; n < 10; ++n ) |
||||||
|
{ |
||||||
|
features.push_back(Point3i(x, y, n)); |
||||||
|
if( (cur_count += 1) == count ) |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return features; |
||||||
|
} |
||||||
|
|
||||||
|
void computeChannels(cv::InputArray image, cv::OutputArrayOfArrays channels_) |
||||||
|
{ |
||||||
|
Mat src(image.getMat().rows, image.getMat().cols, CV_32FC3); |
||||||
|
image.getMat().convertTo(src, CV_32FC3, 1./255); |
||||||
|
|
||||||
|
Mat_<float> grad; |
||||||
|
Mat gray; |
||||||
|
cvtColor(src, gray, CV_RGB2GRAY); |
||||||
|
|
||||||
|
Mat_<float> row_der, col_der; |
||||||
|
Sobel(gray, row_der, CV_32F, 0, 1); |
||||||
|
Sobel(gray, col_der, CV_32F, 1, 0); |
||||||
|
|
||||||
|
magnitude(row_der, col_der, grad); |
||||||
|
|
||||||
|
Mat_<Vec6f> hist(grad.rows, grad.cols); |
||||||
|
const float to_deg = 180 / 3.1415926; |
||||||
|
for (int row = 0; row < grad.rows; ++row) { |
||||||
|
for (int col = 0; col < grad.cols; ++col) { |
||||||
|
float angle = atan2(row_der(row, col), col_der(row, col)) * to_deg; |
||||||
|
if (angle < 0) |
||||||
|
angle += 180; |
||||||
|
int ind = angle / 30; |
||||||
|
hist(row, col)[ind] = grad(row, col); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
vector<Mat> channels; |
||||||
|
channels.push_back(gray); |
||||||
|
channels.push_back(grad); |
||||||
|
|
||||||
|
vector<Mat> hist_channels; |
||||||
|
split(hist, hist_channels); |
||||||
|
|
||||||
|
for( size_t i = 0; i < hist_channels.size(); ++i ) |
||||||
|
channels.push_back(hist_channels[i]); |
||||||
|
|
||||||
|
channels_.setTo(channels); |
||||||
|
} |
||||||
|
|
||||||
|
} /* namespace adas */ |
||||||
|
} /* namespace cv */ |
Loading…
Reference in new issue