3

我想在 OpenCV 中创建一个稀疏矩阵。

如何对该矩阵进行基本操作,例如:

从矩阵元素放置或访问数据。

干杯

4

2 回答 2

6

使用 C++ 接口可能更合适。请注意,文档 [1] 中的示例代码缺少模运算,因此失败。

const int dims = 2;
int size[] = {3, 20}; // rows and columns if in two dimensions
SparseMat sparse_mat(dims, size, CV_32F);
for(int i = 0; i < 1000; i++) {
    // create a random index in dims dimensions
    int idx[dims];
    for(int k = 0; k < dims; k++)
        idx[k] = rand() % size[k];

    sparse_mat.ref<float>(idx) += 1.f;
}

cout << "bottom right element @ (2,19) = " << sparse_mat.ref<float>(2,19) << "\n";

Mat dense;
sparse_mat.convertTo(dense, CV_32F);
cout << dense;

给出以下输出

bottom right element @ (2,19) = 19
[9, 23, 13, 26, 18, 13, 18, 15, 13, 17, 13, 18, 19, 6, 20, 20, 12, 15, 15, 15;
 17, 17, 14, 16, 12, 14, 17, 15, 15, 18, 24, 18, 13, 22, 18, 11, 18, 22, 17, 15;
 19, 16, 14, 10, 18, 19, 10, 17, 18, 15, 24, 22, 18, 18, 18, 23, 21, 16, 14, 19]

[1] OpenCV 参考手册。2.4.3 版。2012 年,第 46.

于 2013-01-27T11:01:10.153 回答
1

集和稀疏矩阵,第 23 页:

OpenCV 中的稀疏矩阵使用 CvSet 来存储元素。

CvSparseMat* get_color_map( const IplImage* img ) 
{
  int dims[] = { 256, 256, 256 };
  CvSparseMat* cmap = cvCreateSparseMat(3, dims, CV_32SC1);
  for( int i = 0; i < img->height; i++ ) for( int j = 0; j < img->width; j++ )
  { 
    uchar* ptr=&CV_IMAGE_ELEM(img,uchar,i,j*3);
    int idx[] = {ptr[0],ptr[1],ptr[2]};
    ((int*)cvPtrND(cmap,idx))[0]++; 
  }

  // print the map
  CvSparseMatIterator it;
  for(CvSparseNode *node = cvInitSparseMatIterator( mat, &iterator );
       node != 0; node = cvGetNextSparseNode( &iterator )) 
  {
    int* idx = CV_NODE_IDX(cmap,node); 
    int count=*(int*)CV_NODE_VAL(cmap,idx);
    printf( “(b=%d,g=%d,r=%d): %d\n”, idx[0], idx[1], idx[2], count ); 
  }

  return cmap; 
}
于 2012-04-25T21:05:52.610 回答