Opencv Mat的元素索引生成垃圾

时间:2015-05-05 07:49:22

标签: c++ opencv matrix

我正沿着边缘收集一堆像素并将它们保存在矩阵中。

    cv::Mat vals = cv::Mat(18,7,img.type(),cv::Scalar(0));

    for (int j=1; j<7; j++)
    {
      cv::Point2f coords = start + direction*(step_size*j) - 3*normal;
      cv::Point2f coords_successive = coords + direction - 3*normal;
      cv::Point2f coords_previous = coords - direction - 3*normal;

      for (int y=0; y<7; y++)
      {
        vals.at<int>((j-1)*3, y) = 1;    //this->sample(img, coords_previous+=normal);
        vals.at<int>((j-1)*3+1, y) = 1;  //this->sample(img, coords+=normal);
        vals.at<int>((j-1)*3+2, y) = 1;  //this->sample(img, coords_successive+=normal);
      }

    }

    std::cout << "----" << std::endl;

    for (int x=0; x<18; x++)
    {
        for (int y=0; y<7; y++) 
        {
            std::cout << vals.at<int>(x,y) << "\t";
        }
        std::cout << std::endl;
    }

结果:

1 1 1 1 1 257 256 256 256 256 65792 65536 65536 65536
65536 16842752 16777216 16777216 16777216 16777216 16777216
1 1 1 1 1 257 256 256 256 256 65792 65536 65536 65536
65536 16842752 16777216 16777216 16777216 16777216 16777216
1 1 1 1 1 257 256 256 256 256 65792 65536 65536 65536
65536 16842752 16777216 16777216 16777216 16777216 16777216
1 1 1 1 1 257 256 256 256 256 65792 65536 65536 65536
65536 16842752 16777216 16777216 16777216 16777216 16777216
1 1 1 1 1 257 256 256 256 256 65792 65536 65536 65536
65536 16842752 16777216 16777216 16777216 16777216 16777216
1 1 1 1 1 1 1
256 256 256 256 256 0 1
65536 65536 65536 0 256 0 1

我已经尝试过了: 1)uchar而不是int,正如在处理灰度图像时在其他帖子中所建议的那样, 2)使用int [] []矩阵(正在工作!)并将数据传递给矩阵(产生相同的垃圾) 3)反转指数(我认为“好吧,也许是我采用未定义矩阵的值)但是......同样的垃圾。”

2 个答案:

答案 0 :(得分:0)

cv:Scalar通常是double类型。

第一个索引通常是行,第二个索引是列。这在图像处理中很常见

答案 1 :(得分:0)

打印垫子结构时,您会混淆行和列。您可以使用以下代码。如果您的图像是8UC1通道,则必须使用uchar进行访问。 vals.at(I,J)。但你还没有指定img.type()是什么。我假设它是CV_8UC1

 cv::Mat vals = cv::Mat(18,7,img.type(),cv::Scalar(0));

for (int j=1; j<7; j++)
{
  cv::Point2f coords = start + direction*(step_size*j) - 3*normal;
  cv::Point2f coords_successive = coords + direction - 3*normal;
  cv::Point2f coords_previous = coords - direction - 3*normal;

  for (int y=0; y<7; y++)
  {
    vals.at<int>((j-1)*3, y) = 1;    //this->sample(img, coords_previous+=normal);
    vals.at<int>((j-1)*3+1, y) = 1;  //this->sample(img, coords+=normal);
    vals.at<int>((j-1)*3+2, y) = 1;  //this->sample(img, coords_successive+=normal);
  }

}

std::cout << "----" << std::endl;
int rows=vals.rows;
int colms=vals.cols;
for (int x=0; x<rows; x++)
{
    for (int y=0; y<colms; y++) 
    {
        std::cout << vals.at<uchar>(x,y) << "\t";
    }
    std::cout << std::endl;
}