我正在学习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;
}
一起使用。
我找到了解决方案:
Mat_
在dst.convertTo(dst, src.type()); // in this particular case: src.type() == CV_8UC3
现在我的问题是:为什么?我声明downsample()
为什么要修改它?
如果我使用@ go4sri回答这一行
Mat(s, src.type());
我得到这个输出:
我真的不明白为什么......
答案 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);
}