我有一个代码,用于在图像上绘制网格线并打印单元格编号。但我有几个问题。代码是
int stepSize = 65;
int k=1;
char s;
int width = src.size().width;
int height = src.size().height;
for (int i = 0; i<height; i += stepSize)
cv::line(src, Point(0, i), Point(width, i), cv::Scalar(0, 255, 255));
for (int i = 0; i<width; i += stepSize)
cv::line(src, Point(i, 0), Point(i, height), cv::Scalar(255, 0, 255));
for (int i = 0; i < width; i += stepSize)
{
for (int j = 0; j < height; j += stepSize)
{
sprintf(&s, "%d", k);
putText(src, &s, Point2f(i, j), FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 255, 255));
}
k++;
}
其中src是
绘制网格后,我得到了你可以看到,我用来打印网格单元编号的变量k,每次移动到下一行时都会初始化为零。这是一个问题。下一个是我想执行网格选择。也就是说,我不想在单元格中打印一个数字,而是将该数字分配给该网格单元格,这样我就可以使用该数字作为特定网格中的各种函数执行。单元格的身份。例如,我想用鼠标点击选择网格单元格或打印出该网格的标识号。
答案 0 :(得分:2)
对于您的第一个问题,我不确定您是否了解您的需求,但是,如果您想以这种方式编号
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 ...
你应该
切换height
/ width
周期
并在内循环中增加k
像
这样的东西for (int j = 0; j < height; j += stepSize)
for (int i = 0; i < width; i += stepSize)
{
sprintf(&s, "%d", k++);
putText(src, &s, Point2f(i, j), FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 255, 255));
}
如果您可以使用C ++ 11,请遵循Miki的建议,只需
for (int j = 0; j < height; j += stepSize)
for (int i = 0; i < width; i += stepSize)
putText(src, std::to_string(k++), Point2f(i, j), FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 255, 255));
对于你的第二个问题......我不确定你想要什么,但我想以下函数(给你一个posX
和posY
坐标点的索引)应该有所帮助(我希望如此)
int getCellId (int posX, int posY, int width, int height, int stepSize)
{
int numCols ( width / stepSize + ( width % stepSize ? 1 : 0 ) );
int col ( posX / stepSize );
int row ( posY / stepSize );
return row * numCols + col + 1;
}
注意+1
中的return
;这是因为你从k=1
开始。