在opencv中绘制,编号和识别网格单元格

时间:2016-06-08 13:37:14

标签: c++ opencv image-processing grid image-segmentation

我有一个代码,用于在图像上绘制网格线并打印单元格编号。但我有几个问题。代码是

    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是

enter image description here

绘制网格后,我得到了

enter image description here

你可以看到,我用来打印网格单元编号的变量k,每次移动到下一行时都会初始化为零。这是一个问题。下一个是我想执行网格选择。也就是说,我不想在单元格中打印一个数字,而是将该数字分配给该网格单元格,这样我就可以使用该数字作为特定网格中的各种函数执行。单元格的身份。例如,我想用鼠标点击选择网格单元格或打印出该网格的标识号。

1 个答案:

答案 0 :(得分:2)

对于您的第一个问题,我不确定您是否了解您的需求,但是,如果您想以这种方式编号

  1  2  3  4  5  6  7  8
  9 10 11 12 13 14 15 16
 17 ...

你应该

  1. 切换height / width周期

  2. 并在内循环中增加k

  3. 这样的东西
    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));
    

    对于你的第二个问题......我不确定你想要什么,但我想以下函数(给你一个posXposY坐标点的索引)应该有所帮助(我希望如此)

    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开始。