2017-06-06 23 views
0

您好我剛開始C++/OPENCV並試圖寫一箇中位數代碼 我很困惑信達......錯誤在C++ OpenCV的我的第一個碼(中值濾波器)

EDIT2: 好的,謝謝親愛的朋友,我的第一個錯誤被糾正 現在這是我的新錯誤: 我想排序9元素Mat文件。我可以使用其他類型的窗口不是Mat文件?我怎麼能corectly排序它

錯誤指的是這一行: 的std ::排序(window.begin(),window.end()); 錯誤:請求'window'中的成員'begin',它是非類類型'cv :: Mat [9]'| | 36 |錯誤:請求'窗口'中的成員'end',它是非類類型'cv :: Mat [9]'|

我的口供MATLAB和我在C++中一個完整的小白,這是我的代碼:

using namespace std; 
using namespace cv; 
Mat img_gray,img; 

int main() 
{ 

img = imread("6.jpg", IMREAD_COLOR); // Load an image 
if(img.empty()) 
    { return -1; } 
cvtColor(img, img_gray, COLOR_BGR2GRAY); 
int M = img.rows; 
int N = img.cols; 
cvNamedWindow("windows",WINDOW_AUTOSIZE); 
imshow("windows",img); 
for (int m = 2; m < M - 1; ++m) 
    for (int n = 2; n < N - 1; ++n) 
    { 
     int k = 0; 
     int tmpmedian = 0; 
     //int window[9]={0}; 
     Mat window[9]; 
     for (int i = m - 1; i < m + 2; ++i){ 
      for (int j = n - 1; j < n + 2; ++j) 
      { 
       window[k++] = img_gray.at<uchar>(i, j); 
      } 
      std::sort(window.begin(), window.end()); 
      tmpmedian = window[5]; 
      fimg[m][n] = tmpmedian; 
     } 
    } 
} 

我是一個學生,需要爲我的類項目 我你的反應非常感謝欣賞

+0

可以通過使用**訪問墊變量的像素值img.at (Y,X); **實施例的代碼: 'Vec3b強度= img.at (Y,X); uchar blue = intensity.val [0]; uchar green = intensity.val [1]; UCHAR紅色= intensity.val [2];' – Ibrahim

+0

感謝的人這個作品 「img.at (Y,X);」很好,現在我遇到了排序問題,並意識到排序後的9個元素的中值不是第5元素! :|當然 –

+0

排序的9-元向量其第五元件(在當然索引4)的中值。它還應該是什麼? – Piglet

回答

0

在你的雙for循環中,試試這個。

int k = 0; 
int tmpmedian = 0; 
int window[9]={0}; 
for (int i = m - 1; i < m + 2; ++i) 
    for (int j = n - 1; j < n + 2; ++j) 
     window[k++] = img_gray.at<uchar>(i, j); 
std::sort(std::begin(window), std::end(window)); 
tmpmedian = window[4]; 
fimg[m][n] = tmpmedian; 
  1. Mat window[9]聲明9 Mat類型的對象的陣列。我不認爲你會這麼想。您只需要一個包含9 int值的數組。所以你需要的是int window[9]

  2. 您對std::begin()std::end()的使用是錯誤的。 std::sort(std::begin(window), std::end(window))是你需要的。

  3. 數組下標從零開始。所以你的中位數存儲在window[4]而不是window[5]