src
1、传统的C风格操作符[] (指针)
for (int i = 0; i < src.rows; i++)
{
Vec3b* data =
src.ptr<Vec3b>(i);
for (int j = 0; j < src.cols; j++)
{
if (data[j][0] > 200 && data[j][2] < 50)
data[j] = Vec3b(255, 255, 255);
}
}
2、迭代器方法
MatIterator_<Vec3b> it, end;
for (it = src.begin<Vec3b>(), end = src.end<Vec3b>(); it != end; ++it)
if ((*it)[0] > 200 && (*it)[2] < 50)
{
(*it)[0] = 255;
(*it)[1] = 255;
(*it)[2] = 255;
}
3、返回引用的动态地址访问函数*
*原文:On-the-fly address calculation with reference returning
for (int i = 0; i < src.rows; ++i)
for (int j = 0; j < src.cols; ++j)
{
Vec3b pixel = src.at<Vec3b>(i, j);
if (pixel[0] > 200 && pixel[2] < 50)
{
src.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
}
}
这三种方法中,第 1 种方法效率最高,但在使用之前,你需要先确保该图像在内存内是连续存储的。建议操作之前先调用函数 isContinuous() 来判断。
但相比之下,第 2 种方法更安全。它会帮你自动跳过内存内的不连续空间,同时也保持了很高的效率。
第 3 种方法是被设定来随机访问像素点的,你要是用它来遍历图像,那效率堪称感人。等你找到萝卜君的时候,他可能把下周的视频都做完了。
那我们就挑一种自己喜爱的方法,完成这一步操作:遍历全图,把蓝色的像素点变成白色。它有点像我们常说的“抠图”。
背景处理对比
(这么干净的背景在现实中是不可能存在的)
经过去除背景之后的图片,仍然有很多像椒盐一样的噪声点,我们管它叫做"椒盐噪声"。
OpenCV 的 imgproc 模块,内含滤波、形态学处理、几何变换等大量实用的图像处理函数,把它们像互相组合起来,足以应对各种场景需求。
例如,图像非线性滤波算法中的中值滤波 medianBlur,对于滤除图像中的“椒盐噪声”,效果优异。
cv::medianBlur(src,dst,3);
滤除椒盐噪声对比
看到了吗!
左图中的“椒盐噪声”,在右图中就消失了!
(没看到的多看几遍)
经过预处理之后的图片
干~干~净~净~
这个时候我们就可以进行物体检测啦!
版权所有:江苏和讯自动化设备有限公司所有 备案号:苏ICP备2022010314号-1
技术支持: 易动力网络