35#include <visp3/core/vpCameraParameters.h>
36#include <visp3/core/vpConfig.h>
37#include <visp3/core/vpMomentBasic.h>
38#include <visp3/core/vpMomentObject.h>
39#include <visp3/core/vpPixelMeterConversion.h>
44#ifdef VISP_HAVE_OPENMP
59double vpMomentObject::calc_mom_polygon(
unsigned int p,
unsigned int q,
const std::vector<vpPoint> &points)
67 den =
static_cast<double>((
p + q + 2) * (
p + q + 1) *
vpMath::comb(p + q, p));
70 for (i = 1;
i <= points.size() - 1;
i++) {
73 for (k = 0; k <=
p; k++) {
75 x_p_k = pow(points[i - 1].get_x(),
static_cast<int>(p - k));
76 for (l = 0; l <= q; l++) {
77 y_q_l = pow(points[i - 1].get_y(),
static_cast<int>(q - l));
82 y_l *= points[
i].get_y();
84 x_k *= points[
i].get_x();
87 s *= ((points[
i - 1].get_x()) * (points[i].get_y()) - (points[i].get_x()) * (points[i - 1].get_y()));
112 for (
unsigned int i = 1; i <
order; i++)
113 cache[i] = cache[i - 1] * x;
116 cache[j] = cache[j -
order] * y;
118 for (
unsigned int j = 1; j <
order; j++) {
119 for (
unsigned int i = 1; i <
order - j; i++) {
120 cache[j *
order + i] = cache[j *
order] * cache[i];
132 cache[0] = IntensityNormalized;
134 double invIntensityNormalized = 0.;
135 if (std::fabs(IntensityNormalized) >= std::numeric_limits<double>::epsilon())
136 invIntensityNormalized = 1.0 / IntensityNormalized;
138 for (
unsigned int i = 1; i <
order; i++)
139 cache[i] = cache[i - 1] * x;
142 cache[j] = cache[j -
order] * y;
144 for (
unsigned int j = 1; j <
order; j++) {
145 for (
unsigned int i = 1; i <
order - j; i++) {
146 cache[j *
order + i] = cache[j *
order] * cache[i] * invIntensityNormalized;
235 if (std::fabs(points.rbegin()->get_x() - points.begin()->get_x()) > std::numeric_limits<double>::epsilon() ||
236 std::fabs(points.rbegin()->get_y() - points.begin()->get_y()) > std::numeric_limits<double>::epsilon()) {
237 points.resize(points.size() + 1);
238 points[points.size() - 1] = points[0];
240 for (
unsigned int j = 0; j <
order *
order; j++) {
247 for (
unsigned int i = 0; i < points.size(); i++) {
248 cacheValues(cache, points[i].get_x(), points[i].get_y());
249 for (
unsigned int j = 0; j <
order; j++) {
250 for (
unsigned int k = 0; k <
order - j; k++) {
299#ifdef VISP_HAVE_OPENMP
300#pragma omp parallel shared(threshold)
305#pragma omp for nowait
306 for (
int i = 0; i < static_cast<int>(image.
getCols()); i++) {
307 for (
int j = 0; j < static_cast<int>(image.
getRows()); j++) {
308 unsigned int i_ =
static_cast<unsigned int>(i);
309 unsigned int j_ =
static_cast<unsigned int>(j);
310 if (image[j_][i_] > threshold) {
316 for (
unsigned int k = 0; k <
order; k++) {
318 for (
unsigned int l = 0; l <
order - k; l++) {
319 curvals[(k *
order + l)] += (xval * yval);
334 for (
unsigned int k = 0; k <
order; k++) {
335 for (
unsigned int l = 0; l <
order - k; l++) {
344 for (
unsigned int i = 0; i < image.
getCols(); i++) {
345 for (
unsigned int j = 0; j < image.
getRows(); j++) {
346 if (image[j][i] > threshold) {
351 for (
unsigned int k = 0; k <
order; k++) {
352 for (
unsigned int l = 0; l <
order - k; l++) {
362 double norm_factor = 1. / (cam.get_px() * cam.get_py());
363 for (std::vector<double>::iterator it =
values.begin(); it !=
values.end(); ++it) {
364 *it = (*it) * norm_factor;
389 unsigned int idx = 0;
390 unsigned int kidx = 0;
392 double intensity = 0;
405 for (
unsigned int j = 0; j < image.
getRows(); j++) {
406 for (
unsigned int i = 0; i < image.
getCols(); i++) {
409 intensity =
static_cast<double>(image[j][i]) * iscale;
410 double intensity_white = 1. - intensity;
418 for (
unsigned int k = 0; k <
order; k++) {
420 for (
unsigned int l = 0; l <
order - k; l++) {
422 values[idx] += cache[idx];
430 for (
unsigned int j = 0; j < image.
getRows(); j++) {
431 for (
unsigned int i = 0; i < image.
getCols(); i++) {
434 intensity =
static_cast<double>(image[j][i]) * iscale;
442 for (
unsigned int k = 0; k <
order; k++) {
444 for (
unsigned int l = 0; l <
order - k; l++) {
446 values[idx] += cache[idx];
453 if (normalize_with_pix_size) {
455 double norm_factor = 1. / (cam.get_px() * cam.get_py());
456 for (std::vector<double>::iterator it =
values.begin(); it !=
values.end(); ++it) {
457 *it = (*it) * norm_factor;
468 order = orderinp + 1;
551 "been computed, you should "
552 "specify a higher order.");
568 "a higher order for the moment object.");
579 std::vector<double> moment = momobj.
get();
580 os << std::endl <<
"Order of vpMomentObject: " << momobj.
getOrder() << std::endl;
582 for (
unsigned int k = 0; k <= momobj.
getOrder(); k++) {
583 for (
unsigned int l = 0; l < (momobj.
getOrder() + 1) - k; l++) {
584 os <<
"m[" << l <<
"," << k <<
"] = " << moment[k * (momobj.
getOrder() + 1) + l] <<
"\t";
619 std::vector<double> moment = momobj.
get();
622 for (
unsigned int k = 0; k <=
order; k++) {
623 for (
unsigned int l = 0; l < (
order + 1) - k; l++) {
624 M[l][k] = moment[k * (
order + 1) + l];
660 for (
unsigned int i = 0; i < m.
values.size(); ++i) {
662 if (i % (m.
order) == 0)
Generic class defining intrinsic camera parameters.
error that can be emitted by ViSP classes.
@ badValue
Used to indicate that a value is not in the allowed range.
Definition of the vpImage class member functions.
unsigned int getCols() const
unsigned int getRows() const
static long double comb(unsigned int n, unsigned int p)
Implementation of a matrix and operations on matrices.
static void printWithIndices(const vpMomentObject &momobj, std::ostream &os)
unsigned int getOrder() const
VP_EXPLICIT vpMomentObject(unsigned int order)
virtual ~vpMomentObject()
void cacheValues(std::vector< double > &cache, double x, double y)
bool flg_normalize_intensity
void set(unsigned int i, unsigned int j, const double &value_ij)
@ WHITE
Not functional right now.
const std::vector< double > & get() const
static vpMatrix convertTovpMatrix(const vpMomentObject &momobj)
std::vector< double > values
vpObjectType getType() const
void fromImage(const vpImage< unsigned char > &image, unsigned char threshold, const vpCameraParameters &cam)
void fromVector(std::vector< vpPoint > &points)
friend VISP_EXPORT std::ostream & operator<<(std::ostream &os, const vpMomentObject &v)
void init(unsigned int orderinp)
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)