C++ OpenCV中cv::Mat的自定义定义类型

C++ OpenCV中cv::Mat的自定义定义类型,c++,opencv,C++,Opencv,我想使用自定义类型的cv::Mat创建一个数组。这是我的密码: typedef struct{ int x; int y; float prob; }CellXY; void main(){ cv::Mat_<CellXY> map(10, 10); std::cout << "Width = " << map.cols << ", Height = " << map.rows << std::en

我想使用自定义类型的cv::Mat创建一个数组。这是我的密码:

typedef struct{
  int x;
  int y;
  float prob;
}CellXY;

void main(){

  cv::Mat_<CellXY> map(10, 10);

  std::cout << "Width = " << map.cols << ", Height = " << map.rows << std::endl;
  std::cout << "### Assignment ###" << std::endl;
  for (int j=0; j<map.rows; j++){
    for (int i=0; i<map.cols; i++){
      map.at<CellXY>(j, i).x = i;
      map.at<CellXY>(j, i).y = j;
      map.at<CellXY>(j, i).prob = (float)(i + j * map.cols);

      std::cout << map.at<CellXY>(j, i).prob 
        << " (" << map.at<CellXY>(j, i).x
        << "," << map.at<CellXY>(j, i).y
        << ")\t";
    }
    std::cout << std::endl;
  }

  std::cout << "### Display ###" << std::endl;
  for (int j=0; j<map.rows; j++){
    for (int i=0; i<map.cols; i++){
      std::cout << map.at<CellXY>(j, i).prob 
        << " (" << map.at<CellXY>(j, i).x
        << "," << map.at<CellXY>(j, i).y
        << ")\t";
    }
    std::cout << std::endl; 
  }
  map.release();
}
typedef结构{
int x;
int-y;
浮动探针;
}赛尔西;
void main(){
cv::Mat_uu图(10,10);

std::cout这是因为OpenCV不知道类的
数据类型。您需要对其进行专门化,例如:

typedef struct {
    int x;
    int y;
    float prob;
}CellXY;


// Add this!!!!!!
namespace cv {
template<> class DataType<CellXY>
{
public:
    typedef CellXY      value_type;
    typedef value_type  work_type;
    typedef value_type  channel_type;
    typedef value_type  vec_type;
    enum { generic_type = 0,
        depth        = CV_32F, // Might cause problems... I'm saying it's all made of floats (and not 2 int a 1 float)
        channels     = 3,
        fmt          = (int)'p',
        type         = CV_MAKETYPE(depth, channels)
    };
};
}

void main() {
    ...
}
您最终可以重载
operator()
,使访问类似于OpenCV Mats

  • 如果
    CellXY
    中的
    x
    y
    字段指的是矩阵位置,为什么需要它们呢?您只需为概率设置一个
    Mat1f
    (又称
    Mat
    ),x,y是矩阵中的位置


  • 非常感谢您的帮助。我通过添加模板类数据类型尝试了您的解决方案,但出现了以下错误:错误:“模板类cv::数据类型”在不同命名空间[-fpPermissive]中的专门化模板类数据类型然而,我确实同意将cv::Mat用于诸如cv::Point3f或cv::Vec3f之类的基本类型总是更好。仅供参考:另外,我尝试修改“CellXY”结构中的数据类型,如下所示,并且在不添加模板数据类型类的情况下,它可以完美地工作。typedef struct{float x;float y;float prob;}CellXY;1)您需要将专门化放入
    名称空间cv
    …请参见编辑。2)哦,我不知道…但是您可以使用
    cv::Vec3f
    ;)这就是我想使用cv::Mat而不是std::vector的原因,因为我想动态更改2D数组的大小。在OpenCV中,可以使用cv::hconcat(B,A,result)轻松完成此操作或cv::vconcat(B、A、结果)。因此,可以轻松地将新数组添加到原始数组的顶部、底部、左侧或右侧位置。将其添加到
    CellXYMatrix
    类将非常简单。但是,只要您100%确定OpenCV函数与自定义数据类型配合良好,我想您是安全的;)@puwanan顺便说一句,第一个问题很好;)
    class CellXYMatrix
    {
         std::vector<CellXY> _mat; // your matrix of CellXY
         int _r; // rows
         int _c; // cols
    
    public:
         CellXYMatrix(int rows, int cols) : _r(rows), _c(cols), _mat(rows * cols) {};
    
         void set(int row, int col, const CellXY& cell) {
            _mat[row * _c + col] = cell;
         }
         CellXY& get(int row, int col) {
            return _mat[row * _c + col];
         }  
    }