OpenCV C++ 接口上的 CamShift 问题

Posted

技术标签:

【中文标题】OpenCV C++ 接口上的 CamShift 问题【英文标题】:Problems with CamShift on the OpenCV C++ interface 【发布时间】:2010-10-18 23:32:34 【问题描述】:

我对 OpenCV 有点陌生,出于某种原因,我无法让 CamShift 在 C++ 中工作。首先,如果有人有使用 C++ 接口的工作 CamShift 示例,我将不胜感激。

其次,我正在尝试将 C 示例改编为 C++,以使其正常工作。还没有什么花哨的。基本上,我在做的是这样的:

// -----------------------

cv::Rect rect = /* some rectangle */;
cv::Mat img = /* some image */;

int bins = 16;
int sMin = 10;
int vMin = 10;
int vMax = 250;

cv::MatND hist(1, &bins, CV_8UC1);

cv::Rect searchWindow = rect;
cv::Mat roi = img(searchWindow);
cv::Mat hsv;
cv::cvtColor(roi, hsv, CV_RGB2HSV);

cv::Mat mask;
cv::inRange(hsv, cv::Scalar(0, sMin, vMin, 0), cv::Scalar(181, 256, vMax, 0), mask);

const int channel = 0;
float range[] = 0, 181;
const float* ranges[] = range;
cv::calcHist(&hsv, 1, &channel, mask, hist, 1, &bins, ranges, true, false);

double histMax;
cv::minMaxLoc(hist, NULL, &histMax);

hist *= histMax ? 255.0 / histMax : 0.0;

int channel = 0;
float range[] = 0, 256;
const float* ranges[] = range;
cv::Mat bp;
cv::calcBackProject(&img, 1, &channel, hist, bp, ranges, 1, true);

cv::RotatedRect foundObject = cv::CamShift(bp, searchWindow,
   cv::TermCriteria(cv::TermCriteria::COUNT | cv::TermCriteria::EPS, 10, 1));

// -----------------------
// -----------------------
// -----------------------
// -----------------------

在此之后,在 cv::CamShift() 内部发生的情况是,尽管参数具有看似有效的值,但 OpenCV 会抛出 cv::Exception 并崩溃并显示以下消息:

OpenCV Error: Assertion failed (box.size.width >= 0 && box.size.height >= 0 && t
hickness <= 255) in unknown function, file ..\..\..\..\ocv\opencv\src\cxcore\cxd
rawing.cpp, line 1666

错误跟踪数据库上似乎没有任何相关的错误,所以...我在这里遗漏了什么?

【问题讨论】:

【参考方案1】:

这是一个比较容易复制的错误。有些情况会出现(移动太快,尤其是撞到相机)导致 cv::RotatedRect( ... ) 的逻辑爆炸并创建一个折叠到一个点或大于框架的框。然后捕获此错误。

执行此操作时,我只是复制了代码并手动检查了有问题的地方的框大小。但归根结底,我会说这个功能假设你的相机是固定的,场景照明没有太大变化。例如,它不能安装在试图追踪其他汽车的汽车上。

像这样的崩溃是计算机视觉中“单元测试”和“代码实践”为何崩溃的一个很好的例子;检查它是否在没有显示的测试服务器上运行是不够的,但它还需要针对所有范围的参数、数据频谱和用户行为运行...

【讨论】:

以上是关于OpenCV C++ 接口上的 CamShift 问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV—用meanshift和Camshift进行目标追踪

使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象

改进 open cv 中的 camshift 算法

如何在 CamShift 中平滑跟踪

[OpenCV-Python] OpenCV 中视频分析 部分 VI

OpenCV 在 Android 上的应用