gpt4 book ai didi

opencv - 在不知道其像素格式的情况下读取 cv::Mat 像素

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:16 40 4
gpt4 key购买 nike

我知道有几种方法可以读取和写入 OpenCV 的像素值 cv::Mat图像/矩阵。一个常见的是 .at<typename T>(int, int)方法 http://opencv.itseez.com/2.4/modules/core/doc/basic_structures.html#mat-at .但是,这需要已知类型名,例如 .at<double> .同样的事情适用于更直接的指针访问 OpenCV get pixel channel value from Mat image .

如何在不知道其类型的情况下读取像素值?例如,接收更通用的 CvScalar 就可以了值(value)返回。效率不是问题,因为我想读取相当小的矩阵。

最佳答案

有点。你可以构造 cv::Mat_并为元素提供显式类型,之后您不必每次都编写元素类型。引用 opencv2/core/mat.hpp

While Mat is sufficient in most cases, Mat_ can be more convenient if you use a lot of element access operations and if you know matrix type at the compilation time. Note that Mat::at(int y,int x) and Mat_::operator()(int y,int x) do absolutely the same and run at the same speed, but the latter is certainly shorter.

Mat_Mat非常相似。再次引用 mat.hpp:

The class Mat_<_Tp> is a thin template wrapper on top of the Mat class. It does not have any extra data fields. Nor this class nor Mat has any virtual methods. Thus, references or pointers to these two classes can be freely but carefully converted one to another.

你可以这样使用它

Mat_<Vec3b> dummy(3,3);
dummy(1, 2)[0] = 10;
dummy(1, 2)[1] = 20;
dummy(1, 2)[2] = 30;
cout << dummy(1, 2) << endl;

为什么我首先说“有点”?因为如果你想在某个地方传递这个 Mat_ - 你必须指定它的类型。像这样:

void test(Mat_<Vec3b>& arr) {
arr(1, 2)[0] = 10;
arr(1, 2)[1] = 20;
arr(1, 2)[2] = 30;

cout << arr(1, 2) << endl;
}
...
Mat_<Vec3b> dummy(3,3);
test(dummy);

从技术上讲,您并没有在像素读取期间指定您的类型,但实际上您仍然必须知道它并事先将 Mat 转换为适当的类型。

我想您可以使用一些低级 hack 找到解决此问题的方法(例如创建一个方法来读取 Mat 的类型,计算元素大小和步幅,然后使用指针算术和转换访问原始数据...)。但是我不知道有什么“干净”的方法可以使用 OpenCV 的功能来做到这一点。

关于opencv - 在不知道其像素格式的情况下读取 cv::Mat 像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34269693/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com