Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
fw:opencv2 [2011/07/01 17:40] alfred |
fw:opencv2 [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== OpenCV ====== | + | ====== OpenCV 2 ====== |
| * [[http://opencv.willowgarage.com/wiki/|Wiki de OpenCV]] | * [[http://opencv.willowgarage.com/wiki/|Wiki de OpenCV]] | ||
| + | |||
| ===== Básico ===== | ===== Básico ===== | ||
| Línea 44: | Línea 45: | ||
| * Copiar una imágen: ''imagen.copyTo(imagen_copia)''. O ''Mat imagen_copia = imagen.clone();''. | * Copiar una imágen: ''imagen.copyTo(imagen_copia)''. O ''Mat imagen_copia = imagen.clone();''. | ||
| * Para volver a asignar un tamaño a una imagen: ''result.create(image.rows, image.cols, image.type())'' | * Para volver a asignar un tamaño a una imagen: ''result.create(image.rows, image.cols, image.type())'' | ||
| + | |||
| Línea 83: | Línea 85: | ||
| * Podemos asignar una fila con un solo valor, por ejemplo asignar la fila 0 el color negro: ''result.row(0).setTo(cv::Scalar(0));''. O un color rgb con: ''cv::Scalar(r,g,b)''. | * Podemos asignar una fila con un solo valor, por ejemplo asignar la fila 0 el color negro: ''result.row(0).setTo(cv::Scalar(0));''. O un color rgb con: ''cv::Scalar(r,g,b)''. | ||
| * Al asignar un valor a un píxel podemos utilizar ''*pixel = cv::saturate_cast<uchar>(valor)'', con esto conseguimos que ''valor'' no supere 255, no sea menor que 0 o, si el decimal, se redondee. | * Al asignar un valor a un píxel podemos utilizar ''*pixel = cv::saturate_cast<uchar>(valor)'', con esto conseguimos que ''valor'' no supere 255, no sea menor que 0 o, si el decimal, se redondee. | ||
| + | * Crear una máscara a partir de una imágen en escala de grises: ''cv::Mat mask = cv::imread("logo.bmp", 0)'' | ||
| + | |||
| ==== Highgui y funciones de ayuda ==== | ==== Highgui y funciones de ayuda ==== | ||
| Línea 90: | Línea 94: | ||
| * **Mostrar una imagen** sobre una ventana creada: ''cv::imshow("identificador", imágen)''. | * **Mostrar una imagen** sobre una ventana creada: ''cv::imshow("identificador", imágen)''. | ||
| * **Guardar una imagen** ''cv::imwrite(ruta, imagen)''. Según la extensión que pongamos en la ruta de la imágen (.bmp, .jpg...) así será el formato de esta. | * **Guardar una imagen** ''cv::imwrite(ruta, imagen)''. Según la extensión que pongamos en la ruta de la imágen (.bmp, .jpg...) así será el formato de esta. | ||
| + | |||
| + | ==== Otras clases ==== | ||
| + | * ''cv::Vec3b'' permite definir un píxel con tres unsigned chars. | ||
| ===== Image Processing ===== | ===== Image Processing ===== | ||
| - | * Hacer **flip** de una imagen: ''cv::flip(imagen1, imagen_resultado, modo)''. Donde modo puede ser 0 (vertical), 1 (horizontal) o un número negativo (para horizontal y vertical). | ||
| - | |||
| - | |||
| + | ==== Funciones útiles ==== | ||
| + | * Hacer **flip** de una imagen: ''cv::flip(imagen1, imagen_resultado, modo)''. Donde modo puede ser 0 (vertical), 1 (horizontal) o un número negativo (para horizontal y vertical). | ||
| + | === Cambiar espacio de colores === | ||
| + | La función ''cv::ctColor'' permite cambiar el espacio de color de una imágen a otro. Se le pasa la imágen que queremos convertir, la imágen donde queremos convertirla y el tipo de conversión. \\ | ||
| + | El tipo de conversión puede ser ''CV_BGR2Gray'' (a grises), ''CV_BGR2Lab'' (a //CIE L*a*b// que es un espacio de color donde es más fácil hacer distancias (euclídeas) entre píxels)... | ||
| + | <code cpp> | ||
| + | converted.create(image.rows,image.cols,image.type()); | ||
| + | cv::cvtColor(image, converted, CV_BGR2Lab); | ||
| + | </code> | ||
| + | ==== Histogramas ==== | ||
| ===== Operadores ===== | ===== Operadores ===== | ||
| Línea 116: | Línea 130: | ||
| result = 0.7 * image1 + 0.9 * image2; | result = 0.7 * image1 + 0.9 * image2; | ||
| </code> | </code> | ||
| + | |||
| + | |||
| ==== Operadores de matrices ==== | ==== Operadores de matrices ==== | ||
| + | * Invertir una matriz: ''mat.inv()''. | ||
| + | * Trasponer la matriz: ''mat.t()''. | ||
| + | * Sacar el determinante: ''mat.determinant()'' | ||
| + | * Encontrar el vector normal: ''mat.norm()'' | ||
| + | * Cross-product: ''v1.cross(v2)'' | ||
| + | * Dot-product: ''v1.dot(v2)'' | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Especificar la región donde operar ==== | ||
| + | === ROIs === | ||
| + | Las ROI (//Region Of Interest//) son porciones de la imágen a partir de la cual podríamos aplicar un operador, para definirlas indicamos la posición mediante un objeto ''cv::Rect'', mediante dos ''cv::Range'' o indicando un rango de filas\columnas: | ||
| + | <code cpp> | ||
| + | cv::Mat roi1 = image(cv::Rect(385, 270, img2.cols, img2.rows)); | ||
| + | cv::Mat roi2 = image(cv::Range(270, 270 + img2.rows), cv::Range(385, 385 + img2.cols)); | ||
| + | cv::Mat roi3 = image.rowRange(start, end); | ||
| + | cv::Mat roi4 = image.colRange(start, end); | ||
| + | |||
| + | imgLogo.copyTo(roi1, mask); | ||
| + | </code> | ||
| + | === Canales === | ||
| + | Para aplicar un operador a un solo canal deberemos separar la imagen en sus canales (''split''), aplicar el operador sobre este y luego volver a unirlos (''merge''): | ||
| + | <code cpp> | ||
| + | std::vector<cv::Mat> planes; // crea un vector de 3 imagenes | ||
| + | cv::split(image1,planes); // divide la imagen de 3 canales en 3 imágenes de 1 canal | ||
| + | planes[0]+= image2; // operamos sobre uno de los canales | ||
| + | cv::merge(planes,result); // unimos los canales | ||
| + | </code> | ||
| ===== Filtros ===== | ===== Filtros ===== | ||