小编App*_*uru的帖子

在OpenCV/C++中使用KalmanFilter跟踪多个移动对象 - 如何将轨道分别分配给检测到的对象

我正在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是否仍然相同,如果没有,则让跟踪器知道它是一个与另一个分开跟踪的新对象.不确定这是否必要或甚至有用,如果是,如何做到这一点.

c++ opencv kalman-filter matlab-cvst video-tracking

8
推荐指数
2
解决办法
1万
查看次数

从Socket到浏览器的C++/OpenCV流式摄像机 - 视频/图像(MJPEG)(Windows 8.1)

对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)

c++ sockets streaming opencv mjpeg

5
推荐指数
1
解决办法
8437
查看次数