如何使用opencv中的UpdateMotionhistory函数修复此错误?

时间:2014-09-05 17:21:31

标签: c++ opencv image-processing computer-vision

我正在学习opencv中的updatemotionhistory函数并想到尝试它。但出于某种原因,我得到了这个错误" OpenCV错误:错误标志(参数或结构字段)(无法识别或不支持 cvGetMat中的ed数组类型),文件C:\ builds \ 2_4_PackSlave-win64-vc11-shared \ openc v \ modules \ core \ src \ array.cpp,第2482行。

我注意到在我实现updatemotionhistory函数后发生了这个错误,这让我觉得我在updatemotionhistory函数中输入参数时可能会犯一个错误。

这是我的代码: -

Mat frame,dst,tst;
double timestamp = (double)clock()/CLOCKS_PER_SEC; // I found this in the Opencv/samples  motempl.cpp
double duration = 1; //same as above , found this value in the opencv/samples/motempl.cpp

videocapture cap(0);
while(1)
    {
        cap.read(frame);
        cvtColor(frame,frame,CV_BGR2GRAY);
        cap.read(dst);
        cvtColor(dst,dst,CV_BGR2GRAY);
        absdiff(frame,dst,frame2);
        imshow("absolute frame difference",frame2);
        threshold(frame2,frame2,60,255,THRESH_BINARY);

        imshow("threshold",frame2);
        updateMotionHistory(frame2,tst,cap_timestamp,duration);

           waitkey(30);

}

我有两个问题: - 我如何获得updatemotionhistory函数的时间戳和持续时间值?我了解到我们可以将timestamp值设为(int cap_timestamp = cap.get(CV_CAP_PROP_POS_MSEC),如何设置持续时间值?

1 个答案:

答案 0 :(得分:2)

我们来看看documentation

void updateMotionHistory(InputArray silhouette, 
                         InputOutputArray mhi, 
                         double timestamp, 
                         double duration)

mhi

  

单通道,32位浮点

因此,请使用CV_32FC1声明您的tst,例如Mat tst(frameHeight, frameWidth CV_32FC1);,可以解决OpenCV错误。

timestampduration定义您的应用程序的“历史记录”。 timestamp表示“现在”,这是一个随着时间的推移而增长的数字; duration表示“您希望存储在mhi(运动历史图像)中的历史记录长度”,这是一个常量。

让我们看一个简单的一维移动球(B):

   B
---|---|---|---|---|--->
   0   1   2   3   4    x

假设球每次都向右移动一个。在时间1,球在:

       B
---|---|---|---|---|--->
   0   1   2   3   4    x

时间(印章)1的轮廓(absdiff,与你的代码相同)是[True,True,False,False,False]。假设mhi的初始值为[0,0,0,0,0]且duration为2:

timestamp     silhouette             mhi
 1          [T, T, F, F, F]  -->  [1, 1, 0, 0, 0]
 2          [F, T, T, F, F]  -->  [1, 2, 2, 0, 0]
 3          [F, F, T, T, F]  -->  [1, 2, 3, 3, 0]
 4          [F, F, F, T, T]  -->  [0, 2, 3, 4, 4]
 ...

mhi存储时间戳的历史记录。例如,mhi[x] == t表示“当时间戳为t时,球在x位置移动。”

根据您在应用程序中对“历史记录”的定义,您可以定义自己的timestampduration。如果你不知道如何确定这两个参数,这里有两个简单的例子:

  • timestamp = clock(); duration = 5000 ms;使用实时作为时间戳,存储最近5秒的历史记录。
  • timestamp = frameNumber(); duration = 50 frames;使用视频帧编号作为时间戳,存储最近50帧的历史记录。 frameNumber()只会在timestamp + 1.0循环中返回while(1)