OpenCVを使用した効率的な背景減算(ビデオファイルではなくカメラを除く、色付きの前景による背景減算)で言われていることのほとんどを作成する必要があります。問題は、そのトピックではバックグラウンド減算フェーズ自体に関する説明がないことです。
公式のopenCVブックとインターネットを見てきましたが、単純なフレーム差分では必要なものには十分ではありません. より精巧な Averaging Background Methodを理解しようとしましたが、平均を取得するためにフレームのcvAccの後で迷子になりました :/
誰かが私を少し助けることができれば、本当に感謝しています..
ありがとう!
私が今持っているコードで編集:
和
cvCvtScale( currentFrame, currentFloat, 1, 0 );
if(totalFrames == 0)
cvCopy(currentFloat, sum);
else
cvAcc(currentFloat, sum);
平均
cvConvertScale( sum, imgBG, (double)(1.0/totalFrames) );
適応された背景(#define でアルファが 0.05 の場合)
cvRunningAvg(currentFrame, imgBG, alpha);
前景のみで最終イメージを作成する(完璧とはほど遠い!)
void createForeground(IplImage* imgDif,IplImage * currentFrame)
{
cvCvtColor(imgDif, grayFinal, CV_RGB2GRAY);
cvSmooth(grayFinal, grayFinal);
cvThreshold(grayFinal, grayFinal, 40, 255, CV_THRESH_BINARY);
unsigned char *greyData= reinterpret_cast<unsigned char *>(grayFinal->imageData);
unsigned char *currentData= reinterpret_cast<unsigned char *>(currentFrame->imageData);
unsigned char *fgData= reinterpret_cast<unsigned char *>(currentFrame->imageData);
int i=0;
for(int j=0 ; j<(grayFinal->width*grayFinal->height) ; j++)
{
if(greyData[j]==0)
{
fgData[i]=0;
fgData[i+1]=0;
fgData[i+2]=0;
i=i+3;
}
else
{
fgData[i]= currentData[i];
fgData[i+1]= currentData[i+1];
fgData[i+2]= currentData[i+2];
i=i+3;
}
}
cvSetData( imgFG , fgData , imgFG->width*imgFG->nChannels);
}
今すぐ問題!
現在の最大の問題は、写真のどこかに電球がある場合、手を「上」に数秒間置いた後、手を離すと、光が長時間前景にとどまることです。 .これについて何か助けはありますか?