1. 程式人生 > >視訊目標檢測中關於對檢測出的目標進行”安全處理“問題

視訊目標檢測中關於對檢測出的目標進行”安全處理“問題

最近做視訊的目標識別和追蹤計數,編譯連線均沒有問題,但是在測試時出現了問題,只要標出的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);

這樣問題就解決了!