opencv 画像線形融合 addWeighted と Qt 表示マット データ

導入

前回のブログでは、highGUI の知識を紹介し、線形融合の例も紹介しましたが、ここでは線形融合を別の例として、Qt での Mat データのレンダリング処理を紹介します。

画像線形融合

理論式: ここに画像の説明を挿入します
g(x) は出力フュージョン ピクセルを表し、α はアルファ係数 0 ~ 1 の値の範囲です。f 0と f 1は背景と前景のピクセルです。

関数プロトタイプ:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1); パラメータの
説明:
src1: 入力グラフ 1
alpha: src1 のアルファ係数
src2: 入力グラフ 2
beta: src2 のアルファ係数
gamma: ガンマ係数
dst: 出力画像

1. 読み取りイメージフュージョン

注: 2 つの融合画像のサイズとタイプは同じである必要があります。

 	//读取图片1
    cv::Mat image1 = cv::imread("F:/work/opencv/linearblending/add.jpg");
    if(image1.empty())
    {
    
    
        qDebug("cv read image1 falied!");
        return;
    }
    //读取图片2
    cv::Mat image2 = cv::imread("F:/work/opencv/linearblending/timg.jpg");
    if(image2.empty())
    {
    
    
        qDebug("cv read image2 falied!");
        return;
    }

    cv::Mat imageROI;
    //将图1与图2线性混合
    addWeighted(image1,0.6,image2,0.9,0,imageROI);

    //显示图片
    bgrMat2Image(imageROI);;

2.matからQImageへ

void LinearBlending::bgrMat2Image(cv::Mat mat)
{
    
    
    if(mat.channels() == 3)
    {
    
    
        qDebug("bgrMat2Image channel 3");
        cv::cvtColor(mat, mat, CV_BGR2RGB);
        mImage = QImage((const uchar*)(mat.data),mat.cols,mat.rows,QImage::Format_RGB888);
    }
    else if(mat.channels() == 4)
    {
    
    
        cv::cvtColor(mat, mat, CV_BGRA2RGBA);
        mImage = QImage((const uchar*)(mat.data),mat.cols,mat.rows,mat.cols*mat.channels(),QImage::Format_ARGB32);
    }
    else
    {
    
    
        //gray
        cv::cvtColor(mat, mat, CV_GRAY2RGB);
        mImage = QImage((const uchar*)mat.data,mat.cols,mat.rows,QImage::Format_Indexed8);
    }
    //mImage.scanLine(0);
    mImage.bits();

    this->update();
}

3.Qペインター表示

void LinearBlending::paintEvent(QPaintEvent *event)
{
    
    
    Q_UNUSED(event)

    QPainter painter(this);
    if(mImage.isNull())
    {
    
    
        qDebug("paintEvent image is null");
        return;
    }
    painter.drawImage(0,0,mImage);
}

もちろん、QImage データを QPixmap に変換して QLabel に表示することもできます。

4.エフェクト表示

写真 1:
ここに画像の説明を挿入します
写真 2:
ここに画像の説明を挿入します
融合後:
ここに画像の説明を挿入します

関心領域融合 ROI

    //读取图片1
    cv::Mat image1 = cv::imread("F:/work/opencv/linearblending/add.jpg");
    if(image1.empty())
    {
    
    
        qDebug("cv read image1 falied!");
        return;
    }
    //读取图片2
    cv::Mat image2 = cv::imread("F:/work/opencv/linearblending/timo.jpg");
    if(image2.empty())
    {
    
    
        qDebug("cv read image2 falied!");
        return;
    }
    //选取感兴趣区域
    cv::Mat imageROI = image1(Rect(240,100,image2.cols,image2.rows));
    //将图1与图2线性混合
    addWeighted(imageROI,0.4,image2,0.8,0,imageROI);
    //显示图片
    bgrMat2Image(image1);

効果は次のとおりです。
ここに画像の説明を挿入します
最後に、ティモ画像が背景画像の対象領域にマージされます。

著者: Feima Programmer
技術交流へようこそ: QQ: 255895056
転載の際は出典を明記し、不適切な点があれば修正してください

おすすめ

転載: blog.csdn.net/haohaohaihuai/article/details/106228733