在 OpenCV 中分配矩阵元素
Assign matrix element in 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 通道浮点元素分配给 n 通道双精度或短元素(
有一个用于cv::Vec<T, n>
的模板化版本,因此您可以制作一个模板函数,采用源和目标类型,以及通道数,如下所示:
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);
}
相关文章:
- 访问动态分配列表中的元素
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- C++ 将元素分配给映射值时访问错误
- 如何通过查找迭代器结果分配给一组对的元素
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 在 CPP 中将元素分配给矢量
- 如何将元素分配给向量?
- 并行算法将向量的元素分配到另一个元素的元素
- 无法在重载运算符时将数组元素分配给类变量"="
- 将字符串元素分配给结构数组中的结构
- 为每个循环中的std :: vector的当前元素分配迭代器
- OpenCV:为矩阵元素分配新值
- 将矢量元素分配给字符变量
- 如何拥有一个带有类元素的向量,其中一些元素分配了构造函数参数
- 为什么std::deque在默认构造函数中为它的元素分配内存?
- C++将字符串的元素分配给一个新字符串