使用opencv进行运动检测的错误
Error in motion detection using opencv
我是使用opencv进行运动检测的初学者。我有 运行 代码,需要人类检测的最终决定。问题是代码没有显示为最终决定。任何人都可以帮助并告诉我代码中的问题是什么吗?请问有什么解决办法吗?
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();
}
你应该修改这一行
if ((float)(detected_motion_count / frame_count) ==0.45)
看起来像这样:
if (((float)detected_motion_count / (float)frame_count) >=0.45)
由于 detected_motion_count
和 frame_count
是整数,否则使用整数除法,结果始终为 0。(至少只要 frame_count
大于 detected_motion_count
)
如果比率 高于 某个阈值,而不是完全等于阈值,通常您还希望输出检测结果。
我是使用opencv进行运动检测的初学者。我有 运行 代码,需要人类检测的最终决定。问题是代码没有显示为最终决定。任何人都可以帮助并告诉我代码中的问题是什么吗?请问有什么解决办法吗?
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();
}
你应该修改这一行
if ((float)(detected_motion_count / frame_count) ==0.45)
看起来像这样:
if (((float)detected_motion_count / (float)frame_count) >=0.45)
由于 detected_motion_count
和 frame_count
是整数,否则使用整数除法,结果始终为 0。(至少只要 frame_count
大于 detected_motion_count
)
如果比率 高于 某个阈值,而不是完全等于阈值,通常您还希望输出检测结果。