gpt4 book ai didi

c++ - 访问 OpenCV Mat 元素时确定模板类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:46 24 4
gpt4 key购买 nike

我正在使用以下代码为图像添加一些噪声(直接来自 OpenCV 引用,第 449 页 -- cv::Mat::begin 的解释):

void
simulate_noise(Mat const &in, double stddev, Mat &out)
{
cv::Size s = in.size();
vector<double> noise = generate_noise(s.width*s.height, stddev);

typedef cv::Vec<unsigned char, 3> V4;
cv::MatConstIterator_<V4> in_itr = in.begin<V4>();
cv::MatConstIterator_<V4> in_end = in.end<V4>();
cv::MatIterator_<V4> out_itr = out.begin<V4>();
cv::MatIterator_<V4> out_end = out.end<V4>();

for (; in_itr != in_end && out_itr != out_end; ++in_itr, ++out_itr)
{
int noise_index = my_rand(noise.size());
for (int j = 0; j < 3; ++j)
(*out_itr)[j] = (*in_itr)[j] + noise[noise_index];
}
}

没有什么太复杂的:

  • inout分配cv::Mat相同尺寸和类型的对象
  • 迭代输入图像in
  • 在每个位置,从 noise 中选择一个随机值( my_rand(int n) 返回 [0..n-1] 中的随机数
  • in 中的像素求和与随机噪声值
  • 将求和结果放入out

我不喜欢这段代码,因为下面的语句似乎是不可避免的:

typedef cv::Vec<unsigned char, 3> V4;

它硬编码了两件事:

  1. 图像有 3 个 channel
  2. channel 深度为8bpp

如果我得到这个typedef错误(例如错误的 channel 深度或错误的 channel 数量),然后我的程序出现段错误。我最初使用 typedef cv::Vec<unsigned char, 4> V4处理具有任意数量 channel 的图像(OpenCV 支持的最大 channel 数为 4),但这会导致段错误。

有什么方法可以避免对上面的两件事进行硬编码?理想情况下,我想要一些通用的东西:

typedef cv::Vec<in.type(), in.size()> V4;

最佳答案

我知道这来晚了。然而,真正解决您的问题的方法是使用 OpenCV 功能来执行您想要执行的操作。

  1. 像您已经做的那样创建噪声 vector (或使用 OpenCV 提供的函数提示!)
  2. 打乱噪声 vector ,这样您就不需要为每个像素单独设置 noise_index;或预先创建随机噪声 vector
  3. 围绕您的混洗/随机 vector 构建一个矩阵标题:cv::Mat_<double>(noise);
  4. 使用矩阵运算进行计算:out = in + noise;cv::add(in, noise, out);
  5. 利润!

此方法的另一个优点是 OpenCV 可能会使用多线程、SSE 或其他任何方法来加速这种大规模元素操作,而您不会这样做。您的代码更简单、更清晰,而且 OpenCV 会为您完成所有讨厌的类型处理。

关于c++ - 访问 OpenCV Mat 元素时确定模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4744001/

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