模糊任何移动的东西
Blur anything that moves
我正在尝试模糊警察行车记录仪拍摄的人物。我的策略是模糊任何移动的东西。我发现 http://derek.simkowiak.net/motion-tracking-with-python/ 但它使用旧版本的 OpenCV。我无法在使用的 OpenCV 版本中找到任何模糊区域的示例。
来自运动跟踪示例的代码:
for box in trimmed_box_list:
cv.Rectangle( display_image, box[0], box[1], cv.CV_RGB(0,255,0), 2 )
模糊区域的新版本 OpenCV 示例代码:
for (x, y, w, h) in results:
detected = True
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
sub_face = frame[y:y+h, x:x+w]
# apply a gaussian blur on this new recangle image
sub_face = cv2.GaussianBlur(sub_face,(23, 23), 30)
# merge this blurry rectangle to our final image
frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = sub_face
如果有人知道如何更改旧版本 OpenCV 的示例,那会很棒,或者如果您有更好的策略来模糊移动的任何东西,请告诉我。
您所引用的link对于您的具体想法来说相当复杂;根据您所说的,您无需担心跟踪任何移动物体,只需模糊 "anything that moves."
为此,我建议进行简单的背景减法。 Here 是一个 link,演示了 OpenCV 支持的三种不同方法。
这是该页面的代码:
#include < stdio.h>
#include < iostream>
#include < opencv2\opencv.hpp>
#include < opencv2/core/core.hpp>
#include < opencv2/highgui/highgui.hpp>
#include < opencv2/video/background_segm.hpp>
#ifdef _DEBUG
#pragma comment(lib, "opencv_core247d.lib")
#pragma comment(lib, "opencv_imgproc247d.lib") //MAT processing
#pragma comment(lib, "opencv_objdetect247d.lib") //HOGDescriptor
//#pragma comment(lib, "opencv_gpu247d.lib")
//#pragma comment(lib, "opencv_features2d247d.lib")
#pragma comment(lib, "opencv_highgui247d.lib")
#pragma comment(lib, "opencv_ml247d.lib")
//#pragma comment(lib, "opencv_stitching247d.lib");
//#pragma comment(lib, "opencv_nonfree247d.lib");
#pragma comment(lib, "opencv_video247d.lib")
#else
#pragma comment(lib, "opencv_core247.lib")
#pragma comment(lib, "opencv_imgproc247.lib")
#pragma comment(lib, "opencv_objdetect247.lib")
//#pragma comment(lib, "opencv_gpu247.lib")
//#pragma comment(lib, "opencv_features2d247.lib")
#pragma comment(lib, "opencv_highgui247.lib")
#pragma comment(lib, "opencv_ml247.lib")
//#pragma comment(lib, "opencv_stitching247.lib");
//#pragma comment(lib, "opencv_nonfree247.lib");
#pragma comment(lib, "opencv_video247d.lib")
#endif
using namespace cv;
using namespace std;
int main()
{
//global variables
Mat frame; //current frame
Mat resizeF;
Mat fgMaskMOG; //fg mask generated by MOG method
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
Mat fgMaskGMG; //fg mask fg mask generated by MOG2 method
Ptr< BackgroundSubtractor> pMOG; //MOG Background subtractor
Ptr< BackgroundSubtractor> pMOG2; //MOG2 Background subtractor
Ptr< BackgroundSubtractorGMG> pGMG; //MOG2 Background subtractor
pMOG = new BackgroundSubtractorMOG();
pMOG2 = new BackgroundSubtractorMOG2();
pGMG = new BackgroundSubtractorGMG();
char fileName[100] = "C:\POSCO\video\/cctv 2.mov"; //Gate1_175_p1.avi"; //mm2.avi"; //";//_p1.avi";
VideoCapture stream1(fileName); //0 is the id of video device.0 if you have only one camera
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3), Point(1,1) );
//unconditional loop
while (true) {
Mat cameraFrame;
if(!(stream1.read(frame))) //get one frame form video
break;
resize(frame, resizeF, Size(frame.size().width/4, frame.size().height/4) );
pMOG->operator()(resizeF, fgMaskMOG);
pMOG2->operator()(resizeF, fgMaskMOG2);
pGMG->operator()(resizeF, fgMaskGMG);
//morphologyEx(fgMaskGMG, fgMaskGMG, CV_MOP_OPEN, element);
imshow("Origin", resizeF);
imshow("MOG", fgMaskMOG);
imshow("MOG2", fgMaskMOG2);
imshow("GMG", fgMaskGMG);
if (waitKey(30) >= 0)
break;
}
}
以此为基础来查找场景中的移动对象,然后您可以通过几种方式对它们进行模糊处理。我想到的一种懒惰的方法是 模糊图像的副本,然后使用背景减法的结果作为蒙版将模糊图像应用到原始图像 。在每一帧上完成,这将模糊背景减法器认为逐帧移动的任何东西。仅模糊来自背景减法器的足够大的像素分组周围的矩形可能是提高效率的好方法。你甚至可以用你喜欢的任何类型的噪音预先填充垫子,然后使用它而不是模糊的副本。
如果你只想模糊人类,事情会变得复杂得多。人体检测器是完全可行的,但如果您希望确保它们在每一帧上都模糊(如果我们在这里谈论身份保护或其他内容),则会变得复杂,因为检测器可能会遗漏一些并且您会 然后 想开始猜测人类在帧之间的位置。无论如何,你没有要求,但仅供参考。
我正在尝试模糊警察行车记录仪拍摄的人物。我的策略是模糊任何移动的东西。我发现 http://derek.simkowiak.net/motion-tracking-with-python/ 但它使用旧版本的 OpenCV。我无法在使用的 OpenCV 版本中找到任何模糊区域的示例。
来自运动跟踪示例的代码:
for box in trimmed_box_list:
cv.Rectangle( display_image, box[0], box[1], cv.CV_RGB(0,255,0), 2 )
模糊区域的新版本 OpenCV 示例代码:
for (x, y, w, h) in results:
detected = True
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
sub_face = frame[y:y+h, x:x+w]
# apply a gaussian blur on this new recangle image
sub_face = cv2.GaussianBlur(sub_face,(23, 23), 30)
# merge this blurry rectangle to our final image
frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = sub_face
如果有人知道如何更改旧版本 OpenCV 的示例,那会很棒,或者如果您有更好的策略来模糊移动的任何东西,请告诉我。
您所引用的link对于您的具体想法来说相当复杂;根据您所说的,您无需担心跟踪任何移动物体,只需模糊 "anything that moves."
为此,我建议进行简单的背景减法。 Here 是一个 link,演示了 OpenCV 支持的三种不同方法。
这是该页面的代码:
#include < stdio.h>
#include < iostream>
#include < opencv2\opencv.hpp>
#include < opencv2/core/core.hpp>
#include < opencv2/highgui/highgui.hpp>
#include < opencv2/video/background_segm.hpp>
#ifdef _DEBUG
#pragma comment(lib, "opencv_core247d.lib")
#pragma comment(lib, "opencv_imgproc247d.lib") //MAT processing
#pragma comment(lib, "opencv_objdetect247d.lib") //HOGDescriptor
//#pragma comment(lib, "opencv_gpu247d.lib")
//#pragma comment(lib, "opencv_features2d247d.lib")
#pragma comment(lib, "opencv_highgui247d.lib")
#pragma comment(lib, "opencv_ml247d.lib")
//#pragma comment(lib, "opencv_stitching247d.lib");
//#pragma comment(lib, "opencv_nonfree247d.lib");
#pragma comment(lib, "opencv_video247d.lib")
#else
#pragma comment(lib, "opencv_core247.lib")
#pragma comment(lib, "opencv_imgproc247.lib")
#pragma comment(lib, "opencv_objdetect247.lib")
//#pragma comment(lib, "opencv_gpu247.lib")
//#pragma comment(lib, "opencv_features2d247.lib")
#pragma comment(lib, "opencv_highgui247.lib")
#pragma comment(lib, "opencv_ml247.lib")
//#pragma comment(lib, "opencv_stitching247.lib");
//#pragma comment(lib, "opencv_nonfree247.lib");
#pragma comment(lib, "opencv_video247d.lib")
#endif
using namespace cv;
using namespace std;
int main()
{
//global variables
Mat frame; //current frame
Mat resizeF;
Mat fgMaskMOG; //fg mask generated by MOG method
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
Mat fgMaskGMG; //fg mask fg mask generated by MOG2 method
Ptr< BackgroundSubtractor> pMOG; //MOG Background subtractor
Ptr< BackgroundSubtractor> pMOG2; //MOG2 Background subtractor
Ptr< BackgroundSubtractorGMG> pGMG; //MOG2 Background subtractor
pMOG = new BackgroundSubtractorMOG();
pMOG2 = new BackgroundSubtractorMOG2();
pGMG = new BackgroundSubtractorGMG();
char fileName[100] = "C:\POSCO\video\/cctv 2.mov"; //Gate1_175_p1.avi"; //mm2.avi"; //";//_p1.avi";
VideoCapture stream1(fileName); //0 is the id of video device.0 if you have only one camera
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3), Point(1,1) );
//unconditional loop
while (true) {
Mat cameraFrame;
if(!(stream1.read(frame))) //get one frame form video
break;
resize(frame, resizeF, Size(frame.size().width/4, frame.size().height/4) );
pMOG->operator()(resizeF, fgMaskMOG);
pMOG2->operator()(resizeF, fgMaskMOG2);
pGMG->operator()(resizeF, fgMaskGMG);
//morphologyEx(fgMaskGMG, fgMaskGMG, CV_MOP_OPEN, element);
imshow("Origin", resizeF);
imshow("MOG", fgMaskMOG);
imshow("MOG2", fgMaskMOG2);
imshow("GMG", fgMaskGMG);
if (waitKey(30) >= 0)
break;
}
}
以此为基础来查找场景中的移动对象,然后您可以通过几种方式对它们进行模糊处理。我想到的一种懒惰的方法是 模糊图像的副本,然后使用背景减法的结果作为蒙版将模糊图像应用到原始图像 。在每一帧上完成,这将模糊背景减法器认为逐帧移动的任何东西。仅模糊来自背景减法器的足够大的像素分组周围的矩形可能是提高效率的好方法。你甚至可以用你喜欢的任何类型的噪音预先填充垫子,然后使用它而不是模糊的副本。
如果你只想模糊人类,事情会变得复杂得多。人体检测器是完全可行的,但如果您希望确保它们在每一帧上都模糊(如果我们在这里谈论身份保护或其他内容),则会变得复杂,因为检测器可能会遗漏一些并且您会 然后 想开始猜测人类在帧之间的位置。无论如何,你没有要求,但仅供参考。