40#include <visp3/core/vpCameraParameters.h>
41#include <visp3/core/vpConfig.h>
42#include <visp3/core/vpMomentBasic.h>
43#include <visp3/core/vpMomentObject.h>
44#include <visp3/core/vpPixelMeterConversion.h>
49#ifdef VISP_HAVE_OPENMP
63double vpMomentObject::calc_mom_polygon(
unsigned int p,
unsigned int q,
const std::vector<vpPoint> &points)
71 den =
static_cast<double>((p + q + 2) * (p + q + 1) *
vpMath::comb(p + q, p));
74 for (i = 1; i <= points.size() - 1; i++) {
77 for (k = 0; k <= p; k++) {
79 x_p_k = pow(points[i - 1].get_x(), (
int)(p - k));
80 for (l = 0; l <= q; l++) {
81 y_q_l = pow(points[i - 1].get_y(), (
int)(q - l));
86 y_l *= points[i].get_y();
88 x_k *= points[i].get_x();
91 s *= ((points[i - 1].get_x()) * (points[i].get_y()) - (points[i].get_x()) * (points[i - 1].get_y()));
115 for (
unsigned int i = 1; i <
order; i++)
116 cache[i] = cache[i - 1] * x;
119 cache[j] = cache[j -
order] * y;
121 for (
unsigned int j = 1; j <
order; j++) {
122 for (
unsigned int i = 1; i <
order - j; i++) {
123 cache[j *
order + i] = cache[j *
order] * cache[i];
135 cache[0] = IntensityNormalized;
137 double invIntensityNormalized = 0.;
138 if (std::fabs(IntensityNormalized) >= std::numeric_limits<double>::epsilon())
139 invIntensityNormalized = 1.0 / IntensityNormalized;
141 for (
unsigned int i = 1; i <
order; i++)
142 cache[i] = cache[i - 1] * x;
145 cache[j] = cache[j -
order] * y;
147 for (
unsigned int j = 1; j <
order; j++) {
148 for (
unsigned int i = 1; i <
order - j; i++) {
149 cache[j *
order + i] = cache[j *
order] * cache[i] * invIntensityNormalized;
231 if (std::fabs(points.rbegin()->get_x() - points.begin()->get_x()) > std::numeric_limits<double>::epsilon() ||
232 std::fabs(points.rbegin()->get_y() - points.begin()->get_y()) > std::numeric_limits<double>::epsilon()) {
233 points.resize(points.size() + 1);
234 points[points.size() - 1] = points[0];
236 for (
unsigned int j = 0; j <
order *
order; j++) {
242 for (
unsigned int i = 0; i < points.size(); i++) {
243 cacheValues(cache, points[i].get_x(), points[i].get_y());
244 for (
unsigned int j = 0; j <
order; j++) {
245 for (
unsigned int k = 0; k <
order - j; k++) {
290#ifdef VISP_HAVE_OPENMP
291#pragma omp parallel shared(threshold)
296#pragma omp for nowait
297 for (
int i = 0; i < (int)image.
getCols(); i++) {
298 for (
int j = 0; j < (int)image.
getRows(); j++) {
299 unsigned int i_ =
static_cast<unsigned int>(i);
300 unsigned int j_ =
static_cast<unsigned int>(j);
301 if (image[j_][i_] > threshold) {
307 for (
unsigned int k = 0; k <
order; k++) {
309 for (
unsigned int l = 0; l <
order - k; l++) {
310 curvals[(k *
order + l)] += (xval * yval);
325 for (
unsigned int k = 0; k <
order; k++) {
326 for (
unsigned int l = 0; l <
order - k; l++) {
335 for (
unsigned int i = 0; i < image.
getCols(); i++) {
336 for (
unsigned int j = 0; j < image.
getRows(); j++) {
337 if (image[j][i] > threshold) {
342 for (
unsigned int k = 0; k <
order; k++) {
343 for (
unsigned int l = 0; l <
order - k; l++) {
353 double norm_factor = 1. / (cam.
get_px() * cam.
get_py());
354 for (std::vector<double>::iterator it =
values.begin(); it !=
values.end(); ++it) {
355 *it = (*it) * norm_factor;
380 unsigned int idx = 0;
381 unsigned int kidx = 0;
383 double intensity = 0;
396 for (
unsigned int j = 0; j < image.
getRows(); j++) {
397 for (
unsigned int i = 0; i < image.
getCols(); i++) {
400 intensity = (double)(image[j][i]) * iscale;
401 double intensity_white = 1. - intensity;
409 for (
unsigned int k = 0; k <
order; k++) {
411 for (
unsigned int l = 0; l <
order - k; l++) {
413 values[idx] += cache[idx];
420 for (
unsigned int j = 0; j < image.
getRows(); j++) {
421 for (
unsigned int i = 0; i < image.
getCols(); i++) {
424 intensity = (double)(image[j][i]) * iscale;
432 for (
unsigned int k = 0; k <
order; k++) {
434 for (
unsigned int l = 0; l <
order - k; l++) {
436 values[idx] += cache[idx];
443 if (normalize_with_pix_size) {
445 double norm_factor = 1. / (cam.
get_px() * cam.
get_py());
446 for (std::vector<double>::iterator it =
values.begin(); it !=
values.end(); ++it) {
447 *it = (*it) * norm_factor;
458 order = orderinp + 1;
493 : flg_normalize_intensity(true), order(max_order + 1), type(
vpMomentObject::DENSE_FULL_OBJECT), values()
502 : flg_normalize_intensity(true), order(1), type(
vpMomentObject::DENSE_FULL_OBJECT), values()
541 "been computed, you should "
542 "specify a higher order.");
558 "a higher order for the moment object.");
579 for (
unsigned int i = 0; i < m.
values.size(); i++) {
581 if (i % (m.
order) == 0)
602 std::vector<double> moment = momobj.
get();
603 os << std::endl <<
"Order of vpMomentObject: " << momobj.
getOrder() << std::endl;
605 for (
unsigned int k = 0; k <= momobj.
getOrder(); k++) {
606 for (
unsigned int l = 0; l < (momobj.
getOrder() + 1) - k; l++) {
607 os <<
"m[" << l <<
"," << k <<
"] = " << moment[k * (momobj.
getOrder() + 1) + l] <<
"\t";
642 std::vector<double> moment = momobj.
get();
645 for (
unsigned int k = 0; k <=
order; k++) {
646 for (
unsigned int l = 0; l < (
order + 1) - k; l++) {
647 M[l][k] = moment[k * (
order + 1) + l];
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.
Class for generic objects.
static void printWithIndices(const vpMomentObject &momobj, std::ostream &os)
unsigned int getOrder() const
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)
void init(unsigned int orderinp)
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)