視訊目標檢測中關於對檢測出的目標進行”安全處理“問題
阿新 • • 發佈:2019-02-12
最近做視訊的目標識別和追蹤計數,編譯連線均沒有問題,但是在測試時出現了問題,只要標出的box與視訊的邊界接觸就會出現程式崩潰,並提示出opencv的斷言提示:
OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width<= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) incv::Mat::Mat
如下圖所示:
用不同的視訊進行測試,才發現只要標出的box與視訊的邊界接觸就會出現程式崩潰,所以對這個問題進行了搜尋和解決,問題的癥結在於box的座標越界了。也就是
box返回的可能是一個負座標,或者是一個超過原圖片外界的座標。於是這時把Rect作為引數傳遞給Mat(Rect ...)的話,它會提示你所要擷取的Rect中的座標越界了!
解決方法就是對rec賦予一個 t安全的 計算最小外接矩形:
CvRect box; vector<float> label_; box.x = ((*iter).xmin) * (img.cols); box.x = box.x > 0 ? box.x : 0;//必須對rio_rect的值進行“安全控制”,不控制在檢測框與影象邊緣‘碰撞後’opencv會報錯!! box.y = ((*iter).ymin) * (img.rows); box.y = box.y > 0 ? box.y : 0;// boudRect的左上的x和y有可能小於0 box.width = (((*iter).xmax) * (img.cols) - ((*iter).xmin) * (img.cols)); // box的右下點可能大於img的範圍 box.width = box.width < (img.cols-box.x) ? box.width : (img.cols - box.x - 1); box.height = (((*iter).ymax) * (img.rows) - ((*iter).ymin) * (img.rows)); box.height = box.height < (img.rows - box.y) ? box.height : (img.rows - box.y - 1);
這樣問題就解決了!