私はopencvのc++apiを学習しており、簡単なアプローチとして、画像をダウンサンプリングすることから始めました(ガウスリサンプリングを使用したpyrDownがあることは知っていますが、Mat
クラスの要素にアクセスする方法を学習するためのものです)
これは私のコードです:
#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;
}
今、私はばかげた方法でダウンサンプリングを行っています。要素を削除しているだけです。そして、私はc++apiを。で使用しようとしていますMat_
。
手動ウィンドウで白いウィンドウが表示されますが、その理由がわかりません。マニュアルをcoutしようとすると、さまざまな値が表示されます。このコードの何が問題になっていますか?
編集1
私は解決策を見つけました:
dst.convertTo(dst, src.type()); // in this particular case: src.type() == CV_8UC3
の終わりにdownsample()
今私の質問は:なぜそれですか?Mat(s, src.type());
私はそれが変更される理由を宣言しますか?
編集2
この行で@go4sri回答を使用する場合
_dst (_j, _i) = src.at<Vec3f>(j, i);
私はこの出力を取得します:
私は本当に理由がわかりません。