Fusión lineal de imágenes Opencv y datos de Mat de visualización Qt
introducción
El blog anterior introdujo algunos conocimientos de highGUI y también utilizó ejemplos de fusión lineal. Aquí tomaremos la fusión lineal como un ejemplo separado e introduciremos el proceso de representación de datos Mat en Qt.
Fusión lineal de imágenes
Fórmula teórica:
g (x) representa el píxel de fusión de salida, α es el rango de valores del coeficiente alfa 0-1. f 0 y f 1 son píxeles de fondo y de primer plano
Prototipo de función:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
Descripción del parámetro:
src1: gráfico de entrada 1
alfa: coeficiente alfa de src1
src2: gráfico de entrada 2
beta: coeficiente alfa de src2
gamma: coeficiente gamma
dst: imagen de salida
1. Leer fusión de imágenes
Nota: El tamaño y tipo de las dos imágenes fusionadas deben ser iguales.
//读取图片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 a 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.Pantalla QPainter
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);
}
Por supuesto, también puede convertir datos de QImage a QPixmap y mostrarlos en QLabel.
4. Visualización de efectos
Imagen 1:
Imagen 2:
Después de la fusión:
ROI de fusión de región de interés
//读取图片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);
El efecto es el siguiente:
finalmente, la imagen de timo se fusiona con el área de interés de la imagen de fondo.
Autor: Programador Feima.
Bienvenido al intercambio técnico: QQ: 255895056.
Indique la fuente de la reimpresión. Si hay algo inapropiado, corríjame.