gpt4 book ai didi

c++ - 在不知道类型 opencv 的情况下访问矩阵值

转载 作者:太空狗 更新时间:2023-10-29 20:56:38 25 4
gpt4 key购买 nike

我正在编写一个函数,我需要在其中访问 Mat 的元素, 但是这个函数可以接收 Mat不同类型的。所以,如果我有:

filtered.at<TypeofMat>(i) = (typeofmat) somevalue;

我只想到做这样的事情filtered.at<myMat.type()>(i) , 但显然这是行不通的,因为 type返回 int

我被卡住了,有人能给我一些启发吗?

最佳答案

您可以将源矩阵转换为 double 矩阵(类型 CV_64F)。这样你就不会因为转换而丢失任何数据。然后你可以像往常一样处理这个矩阵,因为你知道它的类型。最后一步是将目标图像转换回源类型。

不过,您需要知道矩阵的 channel 数。 CV_assert 将确保您正在处理正确的类型。

#include <opencv2/opencv.hpp>
using namespace cv;

void foo(const Mat& src, Mat& dst)
{
// Assert number of channels
CV_Assert(src.channels() == 3);

// Convert to CV64F
Mat3d _src, _dst;
src.convertTo(_src, CV_64F);
_dst.create(_src.size());

// Work on _src and _dst (you know the type)
_dst(0,0) = _src(0,0) + Vec3d(1,2,3);

// Convert _dst to src type
_dst.convertTo(dst, src.type());
}

int main()
{
Mat3b img(10,10,Vec3b(0,0,0));

Mat res;
foo(img, res);

// res will be CV_8UC3

return 0;
}

这种方法还有其他替代方法:

  • 创建一个模板函数并调用适当的特化。参见 here
  • 研究原始指针。参见 here
  • 仅使用能够正确处理每种类型的 OpenCV 函数。参见 here .如果可用,这通常是最佳选择。

关于c++ - 在不知道类型 opencv 的情况下访问矩阵值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33146975/

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