c++ - 在 OpenCV 中分配矩阵元素

标签 c++ opencv

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

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 channel 浮点元素分配给 n channel double 或短元素)

最佳答案

cv::Vec<T, n> 有一个模板版本所以你可以制作一个模板函数,获取源和目标类型,以及 channel 数量,如下所示:

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);
}

关于c++ - 在 OpenCV 中分配矩阵元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56344376/

相关文章:

c++ - 按逗号分隔的顺序打印树

不使用放置新返回的指针时的 C++ 严格别名

c# - 使用 .Net 中的 IAmsiStream 会导致 AccessViolationException

OpenCV 向量到 Mat 但不是 element->row

c++ - 获取轮廓的厚度

c++ - at() 和 row().col() 之间的区别

c++ - vector 类型值不匹配错误

c++ - 确定 `constexpr` 执行 - 在编译期间还是在运行时?

python - 无法使用非主线程在Python-OpenCV(cv2)中启动相机捕获

c++ - 为什么我似乎无法使用带有 C++ 的 OpenCV 获得与 knnMatch 的任何匹配?