-1

私は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);

私はこの出力を取得します: ここに画像の説明を入力してください

私は本当に理由がわかりません。

4

1 に答える 1

1

OpenCVのマットの要素にアクセスする方法は次のとおりです。

シングルチャネルマトリックス(tmp)の場合

Matrix_Name.at<dataType>(row, col)

3チャンネルマトリックスの場合(カラー画像の場合のように)、符号なし文字/フロートマトリックスであるかどうかに応じて、Vec3b/Vec3fタイプを使用する必要があります。

あなたのものはunsignedchar3Dimensionalマトリックスであるため、次のようにアクセスする必要があります。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);
}
于 2012-07-13T09:27:04.377 に答える