2017-06-06 24 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]