我正在突然改变光线下进行背景减法。是否有任何示例代码或方法在OpenCV或IPP中有效地执行此操作?我正在阅读视频帧,因此运行时间应该非常快。提前致谢。
答案 0 :(得分:4)
首先需要设计某种规范化技术,其中两个帧(一个光照较低,另一个光照很多)会被标准化,并且应该包含非常接近的值。
不幸的是我遇到了同样的问题而我无法完全解决问题,但解决此问题的一种方法是执行histogram equalization。
完成均衡后,您可以继续使用简单的背景减法技术。
答案 1 :(得分:0)
我知道这已经老了。但我得到了几乎相同的问题。我所做的是减少所有图像(帧)的RGB分量的强度。对于我在街上检测汽车的情况,几乎可以消除阳光下的突然照明变化。然后将修改后的RGB帧提供给背景减法,例如BackgroundSubtractorMOG2。
这是代码。变量bitshift需要根据条件调整2或4。
void makeIlluminationInvariantRGB(const cv::Mat& frame, cv::Mat& result) {
frame.copyTo(result);
uint8_t* pixelPtr = (uint8_t*)result.data;
int cn = result.channels();
int bitshift = 3;
for(int row = 0; row < result.rows; row++)
{
for(int col = 0; col < result.cols; col++)
{
pixelPtr[row*result.cols*cn + col*cn + 0] = pixelPtr[row*result.cols*cn + col*cn + 0] >> bitshift;
pixelPtr[row*result.cols*cn + col*cn + 1] = pixelPtr[row*result.cols*cn + col*cn + 1] >> bitshift;
pixelPtr[row*result.cols*cn + col*cn + 2] = pixelPtr[row*result.cols*cn + col*cn + 2] >> bitshift;
}
}
}
希望它可以帮助别人。
答案 2 :(得分:0)
我解决这个问题的方法是对减法模型使用meanStdDev公式。如果偏差非常高,我触发了背景模型的重置。