OpenCV 类型独立图像访问的最佳方式?

发布于 2024-12-11 06:24:28 字数 393 浏览 0 评论 0原文

我正在编写一个函数,它采用 OpenCV Mat 结构并进行一些处理。问题是 OpenCV 似乎没有一种独立于类型的方式来访问结构,所以我必须做这样的事情。

int myfunc(cv::Mat& im, int iRow, int iCol)
{
    int iResult = 0; 
    if (im.type()==CV_16U) iResult = (int)im.at<unsighed short>(iRow, icol);
    else if (im.type()==CV_8U) iResult = (int)im.at<uchar>(iRow, icol);

    return iResult;
}

有没有一种干净的方法来做到这一点?

I am writing a function that takes a OpenCV Mat structure and does some processing. The problem is that OpenCV doesn't seem to have a type independent way for accessing the strucutre so I have to do something like this.

int myfunc(cv::Mat& im, int iRow, int iCol)
{
    int iResult = 0; 
    if (im.type()==CV_16U) iResult = (int)im.at<unsighed short>(iRow, icol);
    else if (im.type()==CV_8U) iResult = (int)im.at<uchar>(iRow, icol);

    return iResult;
}

Is there a clean way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

涙—继续流 2024-12-18 06:24:28

这是因为您通常需要高性能的图像处理,因此需要针对 8 位、16 位或双图像类型使用不同的算法。

您可以使用模板化类型来完成这一切,但这通常只是一种可读性较差的 switch 语句方式。

ps 如果您确实关心性能,则不应使用 .at<>运算符,使用 .ptr() 获取指向行开头的指针,然后以您拥有的任何像素类型为单位进行步进

It's because you generally require high performance in image processing and so need different algorithms for 8bit, 16bit or double image types.

You can do it all with templated types but that's often just a less readable way of having a switch statement.

ps if you do care about performance you shouldn't be using the .at<> operator, get a pointer to the start of the line with .ptr() and then step in units of whatever pixel type you have

陌上芳菲 2024-12-18 06:24:28

我发现做到这一点的唯一方法是使用模板化的 MatMat_

因此,对于您的示例,您可以尝试如下操作:

template<class T>
T myfunc(cv::Mat_<T>& im, int iRow, int iCol)
{
    return im(iRow, iCol);
}

希望有帮助!

The only way I have found to do this is to use the templated Mat class Mat_.

So, for your example, you might try something like the following:

template<class T>
T myfunc(cv::Mat_<T>& im, int iRow, int iCol)
{
    return im(iRow, iCol);
}

Hope that helps!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文