我正在学习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),如何设置持续时间值?
答案 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错误。
timestamp
和duration
定义您的应用程序的“历史记录”。 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位置移动。”
根据您在应用程序中对“历史记录”的定义,您可以定义自己的timestamp
和duration
。如果你不知道如何确定这两个参数,这里有两个简单的例子:
timestamp = clock(); duration = 5000 ms;
使用实时作为时间戳,存储最近5秒的历史记录。timestamp = frameNumber(); duration = 50 frames;
使用视频帧编号作为时间戳,存储最近50帧的历史记录。 frameNumber()
只会在timestamp + 1.0
循环中返回while(1)
。