Conjunto imageROI ROI OpenCV aprender área superpuesta la imagen y el retorno de la inversión

Este artículo es de interés en la región 5.2.1 del libro "entrada de programación OpenCV3": retorno de la inversión de esta sección ROI_AddImage función () para mejorar, por lo que su versatilidad se incrementa al menos 1,3 veces, ji, ji! Por cierto, en el proceso de mejora, la comprensión de los parámetros adecuados más detallada punto de conocimiento, ya que puede ser un principiante no más avanzada, que parece!

El origen de la libreta

ROI_AddImage BOOL ()
{
// la imagen de lectura [1]
Mat = srcImage1 imread ( "dota_pa.jpg");
Mat LOGOIMAGE imread = ( "dota_logo.jpg");
if (! SrcImage1.data) {printf ( "lectura ! srcImage1 ~ \ n error "); return false;}
SI (logoImage.data) {printf (" error de lectura LOGOIMAGE ~ \ n ") ;! retorno a la falsa;}
// [2] y para definir un tipo Mat para establecer la ROI
Mat imageROI srcImage1 = (Rect (200, 250, logoImage.cols, logoImage.rows));
// máscara de carga [3] (debe ser en escala de grises)
Mat imread enmascarar = ( "dota_logo.jpg", 0);
// [4] se copiará en la máscara ROI
logoImage.copyTo (imageROI, máscara);
// [5] muestra los resultados
namedWindow ( "<1> implementado utilizando la imagen ROI se superpone ventana ejemplar");
imshow ( "< 1> implementado utilizando la imagen se superpone ROI ventana de muestra", srcImage1);
regreso a la verdadera;
}

Esta función de limitación es que, cada vez por un recorrido de la imagen imagen diferente debe ser modificado en esta función, sino también para modificar la representación de imágenes diferentesfunción de área rectangular Rect ()La coordenada parámetros.

Rect (int_x, int_y, int_width, int_height)

Los dos primeros parámetros para especificar las coordenadas superior izquierda del rectángulo, la longitud y la anchura del rectángulo designado dos

Fuente de los dos últimos parámetros son imagen del logotipo directamente la llamada se puede superponer a la longitud y la anchura de la zona que se marca una imagen del logotipo del mismo tamaño directamente en el fondo con, esto no puede concentrarse. La clave es que los dos primeros parámetros, a saber, la posición del área de juego, la necesidad de un estricto cumplimiento de las normas de coordenadas. Si la NBC esta parte, modificar directamente la imagen caminos quieren probar otros efectos de imagen superpuesta de la cuidadosamente preparada, se encontró que la charla cabezal de ducha único desastre.

Porque antes de que fuera así, elegir cualquier dos imágenes aparentemente similares poner directamente hacia arriba, con resultados predecibles, sino también el mismo error de OpenCV temor encontró.
Aquí Insertar imagen Descripción
Porque al final esto es difícil para que usted pueda llegar a conocer el error de configuración de código o error, ya que ambos son propensos a informar de la misma vómito error! El resultado es que se encuentra en todo el Internet 130 no necesariamente resultará!

Miro a los dibujos del libro se utilizaron en las dos fotos con mi uso del tamaño de píxel, el fondo del libro de fotos 1024x576, logotipo de la foto, 200X200, muestra la imagen de fondo que uso 800X449, 259X200 En la foto logotipo. Los planes son aparentemente logo aproximadamente el mismo tamaño, pero la combinación de código fuente para coordinar los parámetros del problema se puede encontrar en. función RECT () en los dos primeros parámetros de las coordenadas rectangulares especificadas de la esquina superior izquierda, hay coordenadas conocidas de origen (200, 250), si el logo libro con la figura, entonces la esquina inferior derecha de las coordenadas rectangulares (400, 450), es decir, además de logotipo figura en el tamaño de píxel, el fondo aún se encuentra dentro de la gama. Pero si encuentro un mapa, y luego la esquina inferior derecha de las coordenadas del rectángulo (459,450), que puede ser encontrado ordenada 450 tiene más de 449 de fondo alto, el error final, cambie el siguiente parámetro es exitosa. Visible, incluso si es la diferencia entre un píxel no va a funcionar.

Por lo tanto, este problema de unión, para mejorar la función que ROI_AddImage () sobre la base del código fuente, por lo que es más versátil, más que el tamaño de píxel de la función de trayectoria obtenida cada imagen diferente, las imágenes tienen que ser modificados coordenadas observaron parámetros, a los residuos evitar en sí dos 13 minutos vómito!

Mejora de Código

bool ROI_AddImage(Mat srcImage,Mat logoImage)//输入原图,logo图
{
	//设定ROI区域
	Mat imageROI = srcImage(Rect(0, srcImage.rows-logoImage.rows, logoImage.cols, logoImage.rows));//左上角纵坐标(原图高度-logo高度)
	//加载掩膜(必须是灰度图)
	Mat mask;
	cvtColor(logoImage, mask, COLOR_RGB2GRAY);//用转换函数转换成灰度图
	//将掩膜复制到ROI
	logoImage.copyTo(imageROI, mask);
	imshow("【插入处掩膜化】", imageROI);
	//显示结果
	imshow("【叠加结果】", srcImage);
	return true;
}

Es simplemente añadido a la cantidad de la forma función Mat dos tipos de memoria la imagen de fondo de la figura como. Logo mientras que la abscisa parámetro rectangular se establece en 0, es decir, el lado izquierdo de la región rectangular superpuesta la imagen de fondo a la izquierda con, mientras que la ordenada me puse las coordenadas-logo altura muy original, En este caso, coincide con la región más inferior de la parte inferior fondo coincide de borde, es decir, el logotipo superpuesto final de la figura esquina inferior izquierda de la de fondo. Los resultados se muestran a continuación:
Aquí Insertar imagen Descripción
Usted solo tiene que leer las dos imágenes en la función principal, que es mayor que el logotipo de fondo no en la línea, no ignore las coordenadas, muy conveniente der ji, ji! ! ! Por supuesto, con el fin de hacer que la imagen se vea un efecto más inclusiva puede ser utilizado lineal combinación mixta, es decir, utiliza addWeighted () función, no explica específicamente charla, ji espacio limitado!

Todo el código se muestra a continuación, soy muy generosa ji, ji, no me importa acerca de los 13 puntos lío!

#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace cv;
using namespace std;

//-------------自定义一个通用的叠加函数(叠加位置为左下角)----------
bool ROI_AddImage(Mat srcImage,Mat logoImage)//输入原图,logo图
{
	//设定ROI区域
	Mat imageROI = srcImage(Rect(0, srcImage.rows-logoImage.rows, logoImage.cols, logoImage.rows));//左上角纵坐标(原图高度-logo高度)
	//imshow("【ROI区域】", imageROI);

	/***************区域的线性混合******************/
	addWeighted(imageROI, 0.5, logoImage, 0.3, 0., imageROI);

	/***************ROI叠加算法********************/
	//加载掩膜(必须是灰度图)
	/*Mat mask;
	cvtColor(logoImage, mask, COLOR_RGB2GRAY);//用转换函数转换成灰度图
	//imshow("【掩膜图mask】", mask);
	//将掩膜复制到ROI
	logoImage.copyTo(imageROI, mask);
	imshow("【插入处掩膜化】", imageROI);*/
	//显示结果
	imshow("【叠加结果】", srcImage);
	return true;
}

void main()
{
	Mat image = imread("modao.bmp");
	Mat logo = imread("dnf_logo.jpg");
	//记录起始时间
	double time0 = static_cast<double>(getTickCount());
	if (ROI_AddImage(image, logo))
		cout << "运行成功,得出你所需的图像!" << endl;
	//计算运行时间并输出
	time0 = ((double)getTickCount() - time0) / getTickFrequency();
	cout << "此方法运行时间为:" << time0 << "秒" << endl;
	waitKey(0);
}

Los resultados son como sigue:
Aquí Insertar imagen Descripción

resumen

emmm ... De hecho, nada Resumen bueno, de hecho, no más alto nivel charla, sólo para encontrar los parámetros del problema, la manera de mejorar un poco debajo de ella! Puede cambiar realmente la mejor, como un usuario a las coordenadas de entrada de forma manual, por supuesto, tiene una gama de ajustes correspondientes, esto puede ser logrado elegir como colocado. Pero este blogger flop, a nadie le importa ya no tiran la charla, damos la bienvenida a nuevas mejoras, aunque todavía es posible ji, ji NBCS! ! !

Publicado 17 artículos originales · ganado elogios 3 · Vistas 1812

Supongo que te gusta

Origin blog.csdn.net/weixin_43350361/article/details/88226171
Recomendado
Clasificación