source: flair-src/trunk/lib/FlairCore/src/cvmatrix.cpp @ 42

Last change on this file since 42 was 15, checked in by Bayard Gildas, 5 years ago

sources reformatted with flair-format-dir script

File size: 5.7 KB
Line 
1// %flair:license{
2// This file is part of the Flair framework distributed under the
3// CECILL-C License, Version 1.0.
4// %flair:license}
5//  created:    2012/03/21
6//  filename:   cvmatrix.cpp
7//
8//  author:     Guillaume Sanahuja
9//              Copyright Heudiasyc UMR UTC/CNRS 7253
10//
11//  version:    $Id: $
12//
13//  purpose:    Class defining a matrix of kind CvMat
14//
15/*********************************************************************/
16
17#include "cvmatrix.h"
18#include "cvmatrix_impl.h"
19#include <cxcore.h>
20#include <typeinfo>
21
22#include <iostream>
23
24using std::string;
25
26namespace flair {
27namespace core {
28/*! \class cvmatrixElement
29*/
30class cvmatrixElement : public IODataElement {
31public:
32  cvmatrixElement(const cvmatrix *matrix, string name, uint32_t row,
33                  uint32_t col)
34      : IODataElement(matrix, name) {
35    this->matrix = matrix;
36    this->row = row;
37    this->col = col;
38    if (row >= matrix->Rows() || col >= matrix->Cols()) {
39      matrix->Err("index (%i,%i) out of bound (%i,%i)\n", row, col,
40                  matrix->Rows() - 1, matrix->Cols() - 1);
41      size = 0;
42    } else {
43      try {
44        ScalarType const &scalarType = dynamic_cast<ScalarType const &>(
45            matrix->GetDataType().GetElementDataType());
46        size = scalarType.GetSize();
47      } catch (std::bad_cast e) {
48        matrix->Err("type not handled\n");
49        size = 0;
50      }
51    }
52  }
53
54  ~cvmatrixElement() {}
55
56  void CopyData(char *dst) const {
57    if (typeid(matrix->GetDataType().GetElementDataType()) ==
58        typeid(FloatType)) {
59      float value = matrix->Value(row, col);
60      memcpy(dst, &value, sizeof(value));
61    } else if (typeid(matrix->GetDataType().GetElementDataType()) ==
62               typeid(SignedIntegerType)) {
63      switch (matrix->GetDataType().GetElementDataType().GetSize()) {
64      case 1: {
65        int8_t int8Value = matrix->Value(row, col);
66        memcpy(dst, &int8Value, 1);
67      } break;
68      case 2: {
69        int16_t int16Value = matrix->Value(row, col);
70        memcpy(dst, &int16Value, 2);
71      } break;
72      }
73    }
74  }
75
76  DataType const &GetDataType(void) const {
77    return matrix->GetDataType().GetElementDataType();
78  }
79
80private:
81  const cvmatrix *matrix;
82  uint32_t row, col;
83};
84
85cvmatrix::cvmatrix(const Object *parent, uint32_t rows, uint32_t cols,
86                   ScalarType const &elementDataType, string name, uint32_t n)
87    : io_data(parent, name, n), dataType(rows, cols, elementDataType) {
88  pimpl_ = new cvmatrix_impl(this, rows, cols, elementDataType, n);
89
90  for (uint32_t i = 0; i < rows; i++) {
91    for (uint32_t j = 0; j < cols; j++) {
92      AppendLogDescription(pimpl_->descriptor->ElementName(i, j),
93                           elementDataType);
94      SetValue(i, j, 0);
95    }
96  }
97}
98
99cvmatrix::cvmatrix(const Object *parent, const cvmatrix_descriptor *descriptor,
100                   ScalarType const &elementDataType, string name, uint32_t n)
101    : io_data(parent, name, n),
102      dataType(descriptor->Rows(), descriptor->Cols(), elementDataType) {
103  pimpl_ = new cvmatrix_impl(this, descriptor, elementDataType, n);
104
105  for (uint32_t i = 0; i < descriptor->Rows(); i++) {
106    for (uint32_t j = 0; j < descriptor->Cols(); j++) {
107      AppendLogDescription(descriptor->ElementName(i, j), elementDataType);
108      SetValue(i, j, 0);
109    }
110  }
111}
112
113cvmatrix::~cvmatrix() { delete pimpl_; }
114
115IODataElement *cvmatrix::Element(uint32_t row, uint32_t col) const {
116  return new cvmatrixElement(this, Name(row, col), row, col);
117}
118
119IODataElement *cvmatrix::Element(uint32_t index) const {
120  if (Rows() == 1) {
121    return new cvmatrixElement(this, Name(0, index), 0, index);
122  } else if (Cols() == 1) {
123    return new cvmatrixElement(this, Name(index, 0), index, 0);
124  } else {
125    Err("matrix is not 1D\n");
126    return nullptr;
127  }
128}
129
130float cvmatrix::Value(uint32_t row, uint32_t col) const {
131  float value;
132
133  if (row >= (uint32_t)pimpl_->mat->rows ||
134      col >= (uint32_t)pimpl_->mat->cols) {
135    Warn("index (%i,%i) out of bound (%i,%i)\n", row, col,
136         pimpl_->mat->rows - 1, pimpl_->mat->cols - 1);
137    return 0;
138  }
139
140  GetMutex();
141  value = cvGetReal2D(pimpl_->mat, row, col);
142  ReleaseMutex();
143
144  return value;
145}
146
147float cvmatrix::ValueNoMutex(uint32_t row, uint32_t col) const {
148  if (row >= (uint32_t)pimpl_->mat->rows ||
149      col >= (uint32_t)pimpl_->mat->cols) {
150    Warn("index (%i,%i) out of bound (%i,%i)\n", row, col,
151         pimpl_->mat->rows - 1, pimpl_->mat->cols - 1);
152    return 0;
153  }
154
155  return cvGetReal2D(pimpl_->mat, row, col);
156}
157
158void cvmatrix::SetValue(uint32_t row, uint32_t col, float value) {
159  if (row >= (uint32_t)pimpl_->mat->rows ||
160      col >= (uint32_t)pimpl_->mat->cols) {
161    Warn("index (%i,%i) out of bound (%i,%i)\n", row, col,
162         pimpl_->mat->rows - 1, pimpl_->mat->cols - 1);
163  } else {
164    GetMutex();
165    cvSetReal2D(pimpl_->mat, row, col, value);
166    ReleaseMutex();
167  }
168}
169
170void cvmatrix::SetValueNoMutex(uint32_t row, uint32_t col, float value) {
171  if (row >= (uint32_t)pimpl_->mat->rows ||
172      col >= (uint32_t)pimpl_->mat->cols) {
173    Warn("index (%i,%i) out of bound (%i,%i)\n", row, col,
174         pimpl_->mat->rows - 1, pimpl_->mat->cols - 1);
175  } else {
176    cvSetReal2D(pimpl_->mat, row, col, value);
177  }
178}
179
180CvMat *cvmatrix::getCvMat(void) const { return pimpl_->mat; }
181
182void cvmatrix::CopyDatas(char *dst) const {
183  GetMutex();
184  // printf("%f %x %i\n",cvGetReal2D(pimpl_->mat,0,0),dst,Size());
185  memcpy(dst, pimpl_->mat->data.ptr, dataType.GetSize());
186  ReleaseMutex();
187}
188
189uint32_t cvmatrix::Rows(void) const { return pimpl_->mat->rows; }
190
191uint32_t cvmatrix::Cols(void) const { return pimpl_->mat->cols; }
192
193string cvmatrix::Name(uint32_t row, uint32_t col) const {
194  return pimpl_->descriptor->ElementName(row, col);
195}
196
197} // end namespace core
198} // end namespace flair
Note: See TracBrowser for help on using the repository browser.