-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