C++怎么表示下一位数值?

int main(int argc, char** argv) 
{
    Mat img = imread("1.png");

    for (int j = 0; j < img.cols; j++) 
    {
        for (int i = 0; i < img.rows - 1; i++) 
        {
                //由白到黑的边界
            if ((img.at<Vec3b>(i, j)[0] == 255) && (img.at<Vec3b>(i + 1, j)[0] == 0) &&
                (img.at<Vec3b>(i, j)[1] == 255) && (img.at<Vec3b>(i + 1, j)[1] == 0) &&
                (img.at<Vec3b>(i, j)[2] == 255) && (img.at<Vec3b>(i + 1, j)[2] == 0))
            {
                cout << j << "," << i << endl;
                
                //下一位比上一位大10以上或小10以上定义为不好 (差分)
                if ((i - (i+1) > 10) || (((i+1) - i) > 10))
                {
                    cout << "数据不好,请重新采样!";
                }
            }
        }
        //break;
    }
    return 0;
}

image.png
如图
j=0时,i=142
i+1只是在i的数值基础上加1
怎么表示下一位数值,让i(上一位)和下一位数值比较?

阅读 1.4k
1 个回答

是不是要计算相邻列白到黑边界的高度差:

int main(int argc, char** argv) 
{
    Mat img = imread("1.png");

    const int threshold = 10;

    bool ok = true;
    int left = -1;
    
    for (int j = 0; j < img.cols; j++) 
    {
        int right = -1;
        for (int i = 0; i < img.rows - 1; i++) 
        {
                //由白到黑的边界
            if ((img.at<Vec3b>(i, j)[0] == 255) && (img.at<Vec3b>(i + 1, j)[0] == 0) &&
                (img.at<Vec3b>(i, j)[1] == 255) && (img.at<Vec3b>(i + 1, j)[1] == 0) &&
                (img.at<Vec3b>(i, j)[2] == 255) && (img.at<Vec3b>(i + 1, j)[2] == 0))
            {
                right = i;
                break;
            }
        }
        if (right == -1)
        {
            cout << "第" << j << "列未找到白到黑边界" << endl;
            ok = false;
            break;
        }
        cout << j << "," << right << endl;
        if (left != -1 && abs(left - right) > threshold)
        {
            cout << "第" << j - 1 << "列和第" << j << "列白到黑边界的高度差超过阈值" << threshold << endl;
            ok = false;
            break;
        }
        left = right;
    }
    cout << (ok ? "数据良好" : "数据不好,请重新采样!") << endl;
    return 0;
}

建议不要嵌套循环,尽量抽取成函数,有利于减少嵌套,整理逻辑,提高可读性
上面代码可重构为:

int find_white_before_black(const Mat &img, int j) {
  Vec3b white(255, 255, 255), black(0, 0, 0);
  for (int i = 0; i < img.rows - 1; i++) {
    if (!img.at<Vec3b>(i, j) == white && img.at<Vec3b>(i + 1, j) == black) return i;
  }
  return -1;
}

bool check_bound(const Mat &img, int threshold) {
  int left = find_white_before_black(img, 0);
  if (left == -1) return false;
  for (int j = 1; j < img.cols; j++) {
    int right = find_white_before_black(img, j);
    if (right == -1 || abs(left - right) > threshold) return false;
    left = right;
  }
  return true;
}

int main() {
  Mat img = imread("1.png");
  cout << (check_bound(img, 10) ? "数据良好" : "数据不好,请重新采样!") << endl;
  cout << (check_bound(img, 0) ? "数据良好" : "数据不好,请重新采样!") << endl;
  return 0;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题