【opencv】一文看懂opencv图像坐标系

1 坐标系的定义

  • 坐标系原点为图片左上角点;X轴水平向右,y轴垂直向下
  • 列cols沿水平方向变化,此方向上定义图像宽度width;行rows沿垂直方向变化,此方向上定义图像高度height
    将上述元素画在一张图上,如下图所示

【opencv】一文看懂opencv图像坐标系_第1张图片

2 坐标的遍历访问

2.1 常见结构的坐标定义
  • cv::Mat (int rows, int cols, int type)
    入参顺序先行后列,即图像的高和宽,如画一张高200像素、宽300像素的图像
    // 创建图像,初始化为黑色
    cv::Mat image = cv::Mat::zeros(200, 300, CV_8UC3);
    
    // 设置为纯绿色 (BGR格式:0, 255, 0)
    image.setTo(cv::Scalar(0, 255, 0));
    
    // 显示图像
    cv::imshow("Green Image", image);

【opencv】一文看懂opencv图像坐标系_第2张图片

  • cv::Point (T x, T y)
    入参顺序 x,y,其中x代表横坐标(cols),y代表纵坐标(rows)
    // 创建图像,初始化为黑色
    cv::Mat image = cv::Mat::zeros(200, 300, CV_8UC3);
    
    // 设置为纯绿色 (BGR: 0,255,0)
    image.setTo(cv::Scalar(0, 255, 0));
    
    // 在(50,150)处画一个半径为10的圆,使用黑色填充 (BGR: 0,0,0)
    cv::circle(image, cv::Point(50, 150), 10, cv::Scalar(0, 0, 0), -1);
    
    // 显示图像
    cv::imshow("Green Image with Circle", image);

【opencv】一文看懂opencv图像坐标系_第3张图片

2.2 像素坐标的遍历
  • image.at(i,j)与image.at(Point(i, j))两种遍历方式的比较
    前者中的i对应行号rows,j对应列号cols;前者在遍历中访问的像素点等价于后者的image.at(Point(j,i))
    // 创建200x300的图像,初始化为黑色
    cv::Mat image = cv::Mat::zeros(300, 200, CV_8UC3);

    // 遍历图像的每个像素
    for(int i = 0; i < image.rows; i++) {
        for(int j = 0; j < image.cols; j++) {
            // 获取像素值 (BGR格式)
            cv::Vec3b& pixel = image.at<cv::Vec3b>(i, j);
            // 等价于image.at(cv::Point(j, i))
            
            // 打印像素值
            ...
        }
    }

3 参考文献

参考1
参考2

你可能感兴趣的:(opencv,opencv,计算机视觉,人工智能)