-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);
我得到這個輸出:
我真的不明白爲什麼..
抱歉,但你'src.at(我, j)'我得到奇怪的結果,請參閱編輯 –
nkint
2012-07-13 11:00:05
這是因爲,我沒有看到你的主要功能。你的數據類型是unsigned char而不是float。此外,_rows_對應於_height_ - 不是圖像的寬度!見編輯的答案。 – go4sri 2012-07-13 12:37:36
你試過了我發佈的代碼嗎?我正在使用opencv官方示例的lena.jpg,相同的結果 – nkint 2012-07-13 13:13:52