2012-07-12 42 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