我正沿着边缘收集一堆像素并将它们保存在矩阵中。
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)反转指数(我认为“好吧,也许是我采用未定义矩阵的值)但是......同样的垃圾。”
答案 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;
}