2016-08-23 28 views
3

在OpenCV的由數除以CV ::墊如果cv::Mat (CV_8U)是由數除以(int)結果將被舍入到最接近的數字,例如:使用整數除法

cv::Mat temp(1, 1, CV_8UC1, cv::Scalar(5)); 
temp /= 3; 
std::cout <<"OpenCV Integer Division:" << temp; 
std::cout << "\nNormal Integer Division:" << 5/3; 

結果是:

OpenCV的整數除法:2

普通整數除法:1

很顯然,即使cv::Mat的類型爲CV_8U,OpenCV也不會使用整數除法。

我的問題是:

  • 爲什麼?不應該將整數分解爲整數。爲什麼這個OpenCV的奇怪行爲?
  • 我可以獲得整數除法而不是逐個像素地進行迭代並分割它嗎?

我當前的解決方案是:

for (size_t r = 0; r < temp.rows; r++){ 
    auto row_ptr = temp.ptr<uchar>(r); 
    for (size_t c = 0; c < temp.cols; c++){ 
     row_ptr[c] /= 3; 
    } 
} 
+2

非常相似的問題http://stackoverflow.com/questions/30833540/is-there-a-way-to-prevent-rounding-in-opencv-matrix-divison – SpamBot

回答

0

我用來解決這個問題的解決方案是:(取決於@Afshine答案,@Miki評論):

if (frame.isContinuous()){ 
    for(int i = 0; i < frame.total(); i++){ 
     frame.data[i]/=3; 
    } 
} 
else{ 
    for (size_t r = 0; r < frame.rows; r++){ 
     auto row_ptr = frame.ptr<uchar>(r); 
     for (size_t c = 0; c < 3 * frame.cols; c++){ 
      row_ptr[c] /= 3; 
     } 
    } 
} 
1

首先:對於分部重載操作者通過轉換矩陣的元素爲雙確實操作。它最初使用乘法運算符:Mat/a = Mat *(1/a)。 二:存在一個小的循環來這是一個非常簡單的方法:

for(int i=0;i<temp.total();i++) 
     ((unsigned char*)temp.data)[i]/=3; 
+1

這不適用於非連續矩陣。 @Humam「目前的解決方案」更好; D – Miki

+0

@Miki!你是對的...必須首先檢查連續性。 。 – Afshin