openCV的.ptr智能指针的简单使用

    cv::Mat image = cv::Mat(400, 600, CV_8UC1); //宽400,长600
    uchar * data00 = image.ptr<uchar>(0);
    uchar * data10 = image.ptr<uchar>(1);
    uchar * data01 = image.ptr<uchar>(0)[1];

解释:

定义了一个Mat变量image。
data00是指向image第一行第一个元素的指针。
data10是指向image第二行第一个元素的指针。
data01是指向image第一行第二个元素的指针


注意:
如果你的程序使用来image.ptr指针,并且出现了下面这样的错误:(假设你使用的软件是Visual Studio 201x)

某某.exe中的 0x75065b68 处有未经处理的异常:Microsoft C++ 异常; 内存位置0x85e790处的cv::Exception。

    1

这可能是因为你不理解image.ptr这个指针,犯了这样的错误:image.ptr(1);指的不是image中第二个像素,而是第一行第二个像素的指针。
使用上面的代码举例:image有400行,有400*600个像素。假设现在你想得到第3行第42个像素的指针,如果你写成:

uchar * data = image.ptr<uchar>(3*image.cols + 42);

    1

这样写是错误的,会出现上面的错误。你得到的不是第3行第42个像素的指针,而是第(3×image.cols + 42)行第0个像素的指针,因为没有(3×image.cols + 42)行,所以没有这个指针,所以错误。
正确的写法:

uchar * data = image.ptr<uchar>(3)[42];

    1

所以要注意这一点:如果程序可以正常编译,但是运行时出错,很有可能是你给指针赋值的时候,索引值溢出指定范围,指针乱指,导致程序跑偏,所以只有在运行时才能发现错误。
OpenCV中,`ptr` 是一个用于访问图像像素数据的指针。它允许你直接访问和修改图像的像素值,这在处理图像时非常有用,因为它可以提供更快的访问速度。 以下是如何使用 `ptr` 来访问和修改图像像素的基本步骤: 1. 首先,你需要加载或创建一个图像。你可以使用 `cv::imread()` 函数从文件中读取图像,或者使用其他函数创建一个新的图像。 2. 然后,你可以通过调用图像对象的 `.ptr<>()` 方法来获取指向图像数据的指针。这个方法需要指定模板参数,即像素的数据类型。例如,对于8位无符号整数类型的图像,你应该使用 `.ptr<uchar>()`。 3. 一旦你有了指针,你就可以通过索引来访问和修改图像的像素值了。例如,要访问位于 (x, y) 位置的像素,你可以使用 `image.ptr<uchar>(y)[x]`。 下面是一个简单的示例代码,展示了如何使用 `ptr` 来遍历图像的所有像素并将它们设置为某个特定的值: ```cpp #include <opencv2/opencv.hpp> int main() { // 加载图像 cv::Mat image = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE); if (image.empty()) { std::cerr << "Image load failed!" << std::endl; return -1; } // 获取图像的行数和列数 int rows = image.rows; int cols = image.cols; // 遍历图像的所有像素 for (int y = 0; y < rows; y++) { // 获取指向第 y 行的指针 uchar* row_ptr = image.ptr<uchar>(y); for (int x = 0; x < cols; x++) { // 设置像素值为 128 row_ptr[x] = 128; } } // 显示修改后的图像 cv::imshow("Modified Image", image); cv::waitKey(0); return 0; } ``` 在这个例子中,我们首先加载了一张灰度图像,然后使用 `ptr` 方法获取每一行的指针,并通过这个指针来访问和修改每个像素的值。最后,我们显示了修改后的图像。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值