我是OpenCV的新手,由于某种原因,我没有设法让CamShift在C++中工作。首先,如果有人使用C++接口(interface)有一个有效的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
错误跟踪数据库上似乎没有任何相关的错误,所以...我在这里缺少什么?
最佳答案
这是一个中等程度易于复制的错误。在某些情况下(移动太快,尤其是撞到相机)会导致cv::RotatedRect(...)的逻辑爆炸并创建一个折叠到某个点或大于框架的框。然后捕获此错误。
这样做的时候,我只是复制了代码,然后手动检查了有问题的地方的盒子大小。但总而言之,我要说的是,此功能假定您的相机是固定的,并且场景照明没有太大变化。例如,它将无法安装在试图跟踪其他汽车的四处行驶的汽车上。
像这样的崩溃是为什么“单元测试”和“代码实践”在计算机视觉中崩溃的一个很好的例子。不足以检查它是否在没有显示的测试服务器上运行,但是还需要针对所有范围的参数,数据范围和用户行为运行...
关于c++ - OpenCV C++接口(interface)上的CamShift问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3964300/