2017-08-20 24 views
0

私はsaveImageFile()関数を含むクラスMainWindowを持っています。これは、イメージを読み込み、Canvasオブジェクト、レイヤオブジェクトのリストを格納するクラス、2つのOpenCvマット、プレエフェクトMat、およびポストエフェクトMatを含む各レイヤを格納するクラスに配置します。C++、OpenCv:メンバ関数がメンバ変数を更新していません

saveImageFile()では、画像エフェクトlumaToAlpha()をキャンバスのレイヤー[1]に適用します。 lumaToAlpha()は、レイヤーのプリエフェクトMatを取り込んで操作を実行し、レイヤーのポストエフェクトMatに保存します。関数がテストされます。できます。

しかし、ポストエフェクトMatを取得しようとすると、元のMatが取得されます。これは、lumaToAlpha()がまったく何もしなかったか、まったく異なるレイヤーオブジェクトに対して実行されたかのようです。

これはポインタと関係すると思われますが、私は自信がありません。何がうまくいかないのですか?メイン・ウィンドウクラス

...

//member variables of MainWindow... 
Canvas mCanvas;  

void MainWindow::saveImageFile() 
{ 

    Mat mat = imread("C://picture.jpg), CV_LOAD_IMAGE_GRAYSCALE); 

    mCanvas.startCanvas(mat, Canvas::BGRA); 

    mCanvas.getLayer(1).lumaToAlpha(); 
    Mat canvasMat = mCanvas.getLayer(1).getPostEffectMat(); 
    imwrite("C://picture-result.png", canvasMat); 
    //getPostEffectMat is returning the wrong mat! 

} 

Canvasクラス...

//member variables of Canvas... 
enum CanvasColorMode { GREY, BGRA }; 
CanvasColorMode mCanvasColorMode; 
QList<Layer> mLayerSet; 

Canvas::Canvas() 
{ 
    //empty constructor 
} 

Layer Canvas::getLayer(int index) 
{ 
    if(0 <= index && index < mLayerSet.size()){ 
     return mLayerSet.at(index); 
    } 
    throw std::invalid_argument("layer index not in range"); 
} 

void Canvas::startCanvas(Mat base, CanvasColorMode mode) 
{ 
    mLayerSet.clear(); 

    if (base.channels() == 1 && mode == Canvas::BGRA){ 
     cvtColor(base, base, CV_GRAY2BGRA); 
    } else if (base.channels() > 1 && mode == Canvas::GREY){ 
     cvtColor(base, base, CV_BGRA2GRAY); 
    } 

    Layer layer00(makeCheckMat(base.rows, base.cols, mode)); 
    Layer layer01(base); 

    mLayerSet.append(layer00); 
    mLayerSet.append(layer01); 
} 

レイヤクラス...

//layer member variables 
Mat mPreEffectMat; 
Mat mPostEffectMat; 

Layer::Layer(Mat matPrePost) 
{ 
    mPreEffectMat = matPrePost; 
    mPostEffectMat = matPrePost; 
} 

Mat Layer::getPreEffectMat() 
{ 
    return mPreEffectMat; 
} 

Mat Layer::getPostEffectMat() 
{ 
    return mPostEffectMat; 
} 

void Layer::setPreEffectMat(Mat mat) 
{ 
    mPreEffectMat = mat; 

} 

void Layer::setPostEffectMat(Mat mat) 
{ 
    mPostEffectMat = mat; 
    qDebug() << "setPostEffectMat"; 
} 

void Layer::lumaToAlpha() 
{ 
    Mat pre = getPreEffectMat(); 
    Mat post= Mat(pre.rows, pre.cols, CV_8UC4, Scalar::all(0)); 

    //SNIP: converts luminence channel to alpha, function tested 
    //this works exactly how I expect it to. The question is why 
    //is the change not reflected in post mat 

    setPostEffectMat(post); 
} 

答えて

0

私はあなたが名前のメンバ変数を持っていることを推測していますmat。関数内で値を設定したいと考えていました。しかし、関数内で行ったことは、関数ローカル変数を定義することです。同じ名前のメンバー変数は、関数内で何をしても影響を受けません。

変更ライン

// This sets the value of the member variable. 
mat = imread("C://picture.jpg), CV_LOAD_IMAGE_GRAYSCALE); 

// This defines a function local variable. 
Mat mat = imread("C://picture.jpg), CV_LOAD_IMAGE_GRAYSCALE); 

関連する問題