我正在将 samples/c/motempl.c 更新到 OCV 2.3,我对 cv::updateMotionHistory() 方法有点困惑。我按照我在 motempl.c 中看到的内容创建历史记录:
history = cv::Mat::zeros(640, 480, CV_32FC1);
然后,我像这样调用 updateMotionHistory():
cv::Mat diff = cv::Mat::zeros(640, 480, CV_8U);
if(prevFrame.size().width != 0) {
cv::absdiff(currentFrame, prevFrame, diff);
} else {
return;
}
cv::updateMotionHistory( diff, history, getElapsedSeconds(), MHI_DURATION);
看起来没问题,但它总是抛出以下内容:
OpenCV Error: Sizes of input arguments do not match () in cvUpdateMotionHistory
两个矩阵的大小相同,640、480,但为了好玩,我尝试将历史记录更改为 CV_8U,这让我明白了:
OpenCV Error: Unsupported format or combination of formats () in cvUpdateMotionHistory
在样本之后,有这个:
mhi = cvCreateImage( size, IPL_DEPTH_32F, 1 );
我明白为什么历史需要是 float 图像,我只是不确定如何使用矩阵而不是 IplImage 实例调用此方法。谢谢!
最佳答案
好的,所以我想通了,就在将其设为赏金之后,我想我应该发布答案,但不确定这样做的礼节是什么。历史需要为 CV_32FC1:
history = cv::Mat::zeros(480, 640, CV_32FC1);
初始化 Mat 的行/列也有点不直观:
cv::Mat diff = cv::Mat::zeros(480, 640, CV_8UC1); // not 640,480
然后:
cv::updateMotionHistory( diff, history, getElapsedSeconds(), MHI_DURATION);
关于c++ - 如何在 OpenCV 中调用 cv::updateMotionHistory(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9815712/