opencv,访问下采样元素但出现白色窗口

时间:2012-07-12 22:52:41

标签: c++ opencv types resampling

我正在学习opencv的c ++ api,对于一个简单的方法,我开始尝试下采样图像(好吧我知道有高斯重采样的pyrDown但它是学习如何访问{{1}中的元素} class)

这是我的代码:

Mat

现在,我正在以愚蠢的方式进行下采样:我只是删除元素。我尝试将c ++ api与#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #define original_window "original" #define manual_window "manual" using namespace cv; using namespace std; Mat img, manual; void downsample(Mat src, Mat &dst, const Size& s) { float factor = src.rows/(float)s.width; Mat_<Vec3f> _dst = Mat(s, src.type()); Mat_<Vec3f> _src = src; for(int i=0; i<src.cols; i+=factor) { int _i = i/factor; for(int j=0; j<src.rows; j+=factor) { int _j = j/factor; _dst (_j, _i) = _src(j,i); } } cout << "downsample image size: " << _dst.rows << " " << _dst.cols << endl; dst = Mat(_dst); } int main(int /*argc*/, char** /*argv*/) { img = imread("lena.jpg"); cout << "original image size: " << img.rows << " " << img.cols << endl; downsample(img, manual, Size(img.cols/2, img.rows/2)); namedWindow(original_window, CV_WINDOW_AUTOSIZE); namedWindow(manual_window, CV_WINDOW_AUTOSIZE); while( true ) { char c = (char)waitKey(10); if( c == 27 ) { break; } imshow( original_window, img ); imshow( manual_window, manual ); } return 0; } 一起使用。

在手动窗口中我得到一个白色的窗口,我不明白为什么。事件,如果我尝试cout手册我看到不同的值..这段代码有什么问题?

编辑1

我找到了解决方案:

Mat_

dst.convertTo(dst, src.type()); // in this particular case: src.type() == CV_8UC3

的末尾

现在我的问题是:为什么?我声明downsample()为什么要修改它?

编辑2

如果我使用@ go4sri回答这一行

Mat(s, src.type());

我得到这个输出: enter image description here

我真的不明白为什么......

1 个答案:

答案 0 :(得分:1)

在OpenCV Mat中访问元素的方法如下:

表示单通道矩阵(tmp)

Matrix_Name.at<dataType>(row, col)

对于三通道矩阵(如彩色图像的情况),您将需要使用Vec3b / Vec3f类型,具体取决于您的是否是无符号字符/浮点矩阵。

因为你的是一个无符号的char三维矩阵: 您必须以src.at<Vec3b>(i, j)

的形式访问它

你的缩减示例应该是:

void downsample(const Mat& src, Mat &dst, const Size& s) {
    float factor = src.rows/(float)s.height;
    Mat _dst = Mat(s, src.type());

    for(int i=0; i < src.cols; i += factor) {
        int _i = i/factor;
        for(int j=0; j<src.rows; j+=factor) {
            int _j = j/factor;
            _dst.at<Vec3b> (_j, _i) = src.at<Vec3b>(j, i);
        }
    }
    cout << "downsample image size: " << _dst.rows << " " << _dst.cols << endl;
    dst = Mat(_dst);
}