2012-07-12 79 views
-1

我正在学习opencv的C++ api,对于一个简单的方法,我已经开始尝试下采样图像(好吧,我知道有pyrDown与高斯重采样,但它是学习如何在Mat类访问元素)opencv,访问降采样元素,但出现白色窗口

这是我的代码:

#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; 
} 

现在,我做了采样在一个傻瓜的方式:我只是删除元素。我试着用Mat_来使用C++ api。

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

编辑1

我已经找到了解决办法:

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

downsample()

结束,现在我的问题是:为什么呢?我声明Mat(s, src.type());为什么它被修改?

EDIT 2

如果我使用@ go4sri回答与此行

_dst (_j, _i) = src.at<Vec3f>(j, i); 

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

我真的不明白为什么..

回答

1

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

用于单个信道矩阵(TMP)

Matrix_Name.at<dataType>(row, col) 

对于三个信道矩阵(如为彩色图像的情况下),则需要使用取决于如果你是一个无符号的Vec3b/Vec3f类型char/float矩阵。

因为你是一个无符号的字符3维矩阵: 你必须访问它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); 
} 
+0

抱歉,但你'src.at (我, j)'我得到奇怪的结果,请参阅编辑 – nkint 2012-07-13 11:00:05

+0

这是因为,我没有看到你的主要功能。你的数据类型是unsigned char而不是float。此外,_rows_对应于_height_ - 不是图像的宽度!见编辑的答案。 – go4sri 2012-07-13 12:37:36

+0

你试过了我发布的代码吗?我正在使用opencv官方示例的lena.jpg,相同的结果 – nkint 2012-07-13 13:13:52