阅读 254

opencv 使用cv :: Mat :: ptr指针进行有效的像素访问

示例

如果效率很重要,则迭代cv::Mat对象中像素的一种快速方法是使用其ptr<T>(int r)方法获取指向行首的指针r(基于0的索引)。

根据矩阵类型,指针将具有不同的模板。

  • 对于CV_8UC1:uchar* ptr = image.ptr<uchar>(r);

  • 对于CV_8UC3:cv::Vec3b* ptr = image.ptr<cv::Vec3b>(r);

  • 对于CV_32FC1:float* ptr = image.ptr<float>(r);

  • 对于CV_32FC3:cv::Vec3f* ptr = image.ptr<cv::Vec3f>(r);

ptr然后,可以通过调用使用此对象访问行r和列上的像素值。cptr[c]

为了说明这一点,这是一个示例,其中我们从磁盘加载图像并反转其蓝色和红色通道,逐像素进行操作:


#include <opencv2/core.hpp>#include <opencv2/imgproc.hpp>#include <opencv2/highgui.hpp>int main(int argc, char** argv) {
    cv::Mat image = cv::imread("image.jpg", CV_LOAD_IMAGE_COLOR);

    if(!image.data) {
        std::cout << "Error: the image wasn't correctly loaded." << std::endl;
        return -1;
    }

    // 我们遍历图像的所有像素    for(int r = 0; r < image.rows; r++) {
        // 我们获得一个指向行r开头的指针        cv::Vec3b* ptr = image.ptr<cv::Vec3b>(r);

        for(int c = 0; c < image.cols; c++) {
            // 我们反转像素的蓝色和红色值            ptr[c] = cv::Vec3b(ptr[c][2], ptr[c][1], ptr[c][0]);
        }
    }

    cv::imshow("Inverted Image", image);
    cv::waitKey();

    return 0;


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐