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