I am the beginner in using opencv for motion detecion. I had ran the code and need the final decision for human detection. The problem is the code did not show for the final decision. Can anyone help and tell me what is the problem from the code? May I have any solution due to the problem?
int main()
{
Mat frame;
Mat resize_blur_Img;
Mat fgMaskMOG;
Mat fgMaskMOG2;
Mat fgMaskGMG;
Mat binaryImg;
Ptr<BackgroundSubtractor>pMOG;
pMOG = new BackgroundSubtractorMOG();
char filename[100] = "C:/Users/user/Desktop/Child Entrapment Prevention System/Motion Only/64.avi";
VideoCapture stream1(filename);
Mat element = getStructuringElement(MORPH_RECT, Size(7, 7), Point(3, 3));
int frame_count = 0;
int detected_motion_count=0;
while (true)
{
if (!(stream1/*cap*/.read(frame)))
break;
frame_count++;
resize(frame, resize_blur_Img, Size(frame.size().width, frame.size().height));
//BLUR
pMOG->operator()(resize_blur_Img, fgMaskMOG,-1);
//MORPHOLOGY
morphologyEx(fgMaskMOG, binaryImg, CV_MOP_CLOSE, element);
//shadow delete (BINARY)
threshold(binaryImg, binaryImg, 128, 255, CV_THRESH_BINARY); //(input array, output array, threshold value, max value to use threshold type, threshold type)
imshow("Origin", resize_blur_Img);
imshow("MOG", fgMaskMOG);
//PIXEL
int TotalNumberOfPixels = fgMaskMOG.rows*fgMaskMOG.cols;
cout << "The number of pixels that are 255 is " << countNonZero(fgMaskMOG) << endl;
if (countNonZero(fgMaskMOG) >= 1)
{
detected_motion_count++;
printf("Motion DETECTED !\n\n", countNonZero(fgMaskMOG));
}
else
{
printf("Motion NOT DETECTED!\n\n", countNonZero(fgMaskMOG));
}
}
printf("count of frames : %d \n", frame_count);
printf("count motion detected: %d \n", detected_motion_count);
printf("Motion Found %d percent of frames ! \n", (int)(100 * detected_motion_count / frame_count));
if ((float)(detected_motion_count / frame_count) ==0.45)
{
printf("\n\n------------------------FINAL DECISION------------------------------");
printf("HUMAN DETECTED \n\n");
}
getchar();
}
You should modify this line
if ((float)(detected_motion_count / frame_count) ==0.45)
to look like this:
if (((float)detected_motion_count / (float)frame_count) >=0.45)
Since detected_motion_count
and frame_count
are integers, integer divison is used otherwise and the result is always 0. (at least as long as frame_count
is bigger than detected_motion_count
)
Also usually you want to output a detection if the ratio is above a certain threshold, not exactly equal to the threshold.