首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenCV中分配矩阵元素

问在OpenCV中分配矩阵元素
EN

Stack Overflow用户
提问于 2019-05-28 22:23:32
回答 1查看 131关注 0票数 0

在OpenCV中,将一个源矩阵中的元素分配给目标矩阵的最常见方法是什么?我总是发现自己编写了这样的代码,这并不是很优雅:

代码语言:javascript
复制
cv::Mat source; // CV_32FC3
cv::Mat dest;   // CV_32FC3

// ...

switch( source.channels() )
{
case 1:
    {
        dest.at<float>( y, x ) = source.at<float>( j, i );
        break;
    }
case 2:
    {
        dest.at<cv::Vec2f>( y, x ) = source.at<cv::Vec2f>( j, i );
        break;
    }
case 3:
    {
        dest.at<cv::Vec3f>( y, x ) = source.at<cv::Vec3f>( j, i );
        break; 
    }
case 4:
    {
        dest.at<cv::Vec4f>( y, x ) = source.at<cv::Vec4f>( j, i );
        break;
    }
}

我想知道推荐的方法是什么,一定有一些通用的一行程序,对吧?

跨不同数据类型工作的解决方案的加分(例如,将n通道浮点元素分配给n通道双或短元素)

EN

回答 1

Stack Overflow用户

发布于 2019-05-28 23:01:40

有一个针对cv::Vec<T, n>的模板版本,因此您可以创建一个模板函数,获取源和目标类型,以及通道数量,如下所示:

代码语言:javascript
复制
template<typename TSrc, typename TDst, int N>
void assign(const cv::Mat& src, cv::Mat& dst, int x, int y)
{
    assert(src.channels() == N);
    assert(dst.channels() == N);
    assert(src.size() == dst.size());

    const cv::Vec<TSrc, N>& srcVec = src.at<cv::Vec<TSrc, N>>(x, y);
    cv::Vec<TDst, N>& dstVec = dst.at<cv::Vec<TDst, N>>(x, y);
    for (int i = 0; i < N; ++i)
        dstVec[i] = static_cast<TDst>(srcVec[i]);
}
int main(int argc, char* argv[])
{   //sample usage:
    cv::Mat src(5, 5, CV_8UC3, cv::Scalar::all(255)), dst(5, 5, CV_32FC3, cv::Scalar::all(1));
    assign<unsigned char, float, 3>(src, dst, 3, 3);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56344376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档