我正在OpenCV/C++中进行实时运动检测和对象跟踪,目前我正处于跟踪部分.
Matlab-我想做的例子:http://www.mathworks.de/de/help/vision/examples/motion-based-multiple-object-tracking.html(我对跟踪部分感到困扰以及如何将其转移到C++/OpenCV)
我的运动部件与OpenCVs BackgroundSubtractor MOG2配合使用,可以找到轮廓并过滤掉较小的轮廓.
对于跟踪我目前正在使用卡尔曼滤波器(具有类似实施本),这现在是越来越称为每一帧,如果运动物体被发现并绘制一条直线上它的路径.我的检测和跟踪部分看起来像这样:
BackgroundSubtractorMOG2 bg;
bg.operator()(frame, threshold);
bg.getBackgroundImage(background);
... //morphological operations to remove noise etc.
findContours(threshold, ...);
... //filtering to reject contours which are too smalle/too big
for(int i = 0; i < contours.size(); i++){
approxPolyDP(...);
boundRect = boundingRect(...);
x = boundRect.x + boundRect.width/2;
y = boundRect.y + boundRect.height/2;}
kalmanFilter.track(x,y);
kalmanFilter.draw(frame);
Run Code Online (Sandbox Code Playgroud)
当前问题: 我有一个有0个移动物体的场景,然后有1个物体移入,通过轮廓检测并被跟踪.然后第二个物体在视线中移动,被检测到并使跟踪器跳到它而不是跟随第一个或单独标记(我想要).
当前跟踪器获取找到的对象的x和y坐标.像这样,一旦检测到另一个对象,跟踪器仍假定它是相同的对象,但具有比预期的其他坐标.
可以看出,没有将"轨迹"分配给某个对象的功能,这可能是最大的问题.我读到了匈牙利算法,但我不确定如何在我的函数中实现它.
什么是使跟踪工作多个对象的好方法?
我的想法是,如果我对每个对象进行唯一识别,我可以检查ID是否仍然相同,如果没有,则让跟踪器知道它是一个与另一个分开跟踪的新对象.不确定这是否必要或甚至有用,如果是,如何做到这一点.
对openCV/C++来说还是一个新手,所以请耐心等待:)
我目前正在尝试从我的OpenCV应用程序中实时(或几乎实时)流式传输我的相机帧,以便我可以打开浏览器,键入IP并查看图像.
到目前为止,我使用winsock2完成了服务器(如果有人有一个很好的跨平台替代品,可以告诉我有什么不同,我会很高兴)并且可以通过在我的浏览器中输入IP来连接它.
孔型/服务器的代码:
//socket
long rc;
SOCKET acceptSocket;
SOCKADDR_IN addr;
WSADATA wsa;
// initialize winsock
rc=WSAStartup(MAKEWORD(2,0),&wsa);
if(rc!=0)
{
printf("Error: startWinsock, Errorcode: %d\n",rc);
return 1;
}
else
{
printf("Winsock initialized!\n");
}
// create Socket
acceptSocket=socket(AF_INET,SOCK_STREAM,0);
if(acceptSocket==INVALID_SOCKET)
{
printf("Error: Socket-Creation failed, Errorcode: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Socket succesfully created!\n");
}
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_family=AF_INET;
addr.sin_port=htons(8080);
addr.sin_addr.s_addr=ADDR_ANY;
rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
if(rc==SOCKET_ERROR)
{
printf("Error: bind, Errorcode: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Socket bound to port 8080\n");
}
rc=listen(acceptSocket,10);
if(rc==SOCKET_ERROR)
{
printf("Error: listen, Errorcode: %d\n",WSAGetLastError()); …Run Code Online (Sandbox Code Playgroud)