2010-10-18 47 views
2

我對OpenCV有點新,因爲某些原因,我沒有設法讓CamShift在C++中工作。首先,如果任何人有一個使用C++接口的CamShift示例,我會非常感激。CamShift在OpenCV C++接口上的問題

其次,我正在嘗試將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的投簡歷::異常和崩潰,以下消息:

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 

在錯誤跟蹤數據庫中似乎沒有任何相關的錯誤,所以......我錯過了什麼,在這裏?

回答

2

這是一箇中等容易複製的錯誤。有些情況會出現(移動速度過快,尤其是碰撞相機),導致cv :: RotatedRect(...)的邏輯爆炸並創建一個框,該框或者摺疊到一個點或者比框架更大。然後這個錯誤被捕獲。

在做這件事時,我只是做了一個代碼的副本,並手動檢查在違規的地方的盒子大小。但是在一天結束的時候,我會說這個功能假定你的相機是固定的,而場景照明變化不大。例如,它將無法安裝在駕駛汽車試圖追蹤其他汽車的車上。

這樣的崩潰是爲什麼「單元測試」和「代碼實踐」在計算機視覺中崩潰的一個很好的例子;它不足以檢查它是否在沒有顯示的測試服務器上運行,但它還需要運行所有範圍的參數,數據頻譜和用戶行爲...