c++ openCv 中的错误我的第一个代码(中值过滤器)

Posted

技术标签:

【中文标题】c++ openCv 中的错误我的第一个代码(中值过滤器)【英文标题】:Error in c++ openCv my very first code (median filter) 【发布时间】:2017-06-06 06:31:43 【问题描述】:

您好,我刚开始使用 c++/openCv 并尝试编写中间代码 我很困惑……

编辑2: 好的感谢亲爱的朋友我的第一个错误已得到纠正 现在这是我的新错误:| 我想对 9 个元素的 Mat 文件进行排序。我可以将 onother 类型用于 window 而不是 Mat 文件吗?如何正确排序

错误是指这一行: std::sort(window.begin(), window.end()); 错误:在 'window' 中请求成员 'begin',它是非类类型 'cv::Mat [9]'| |36|错误:在'window'中请求成员'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;
        
    

我是一名学生,我的课堂项目需要这个 非常感谢您的回复,非常感谢

【问题讨论】:

您可以使用 img.at(y, x); 访问 Mat 变量的像素值;示例代码:Vec3b intensity = img.at&lt;uchar&gt;(y, x); uchar blue = intensity.val[0]; uchar green = intensity.val[1]; uchar red = intensity.val[2]; 感谢这个作品“img.at(y, x);”很好,现在我遇到了排序问题,并意识到排序后的 9 元素向量的中位数不是第 5 个元素! :| 当然是排序后的 9 元素向量的第 5 个元素的中位数(当然在索引 4 处)。还应该是什么? 【参考方案1】:

在你的双 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;

    Mat window[9] 声明了一个包含 9 个 Mat 类型对象的数组。我不认为你会想要那个。您只需要一个包含 9 个 int 值的数组。所以你需要的是int window[9]

    您对std::begin()std::end() 的使用是错误的。 std::sort(std::begin(window), std::end(window)) 是您所需要的。

    数组索引从零开始。所以你的中位数存储在window[4] 而不是window[5]

【讨论】:

以上是关于c++ openCv 中的错误我的第一个代码(中值过滤器)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV + visualStudio,尝试访问像素的 C++ 代码错误

opencv-11-中值滤波及自适应中值滤波

Xcode 中的 OpenCV C++ 错误

用 C++ 和 OpenCV 结合图片

在 OpenCV (C++) 中使用 calcHist 的运行时错误

OpenCV 中的滤波函数