Herramientas de usuario

Herramientas del sitio


fw:opencv2

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
fw:opencv2 [2011/07/01 17:34]
alfred
fw:opencv2 [2020/05/09 09:25] (actual)
Línea 1: Línea 1:
-====== OpenCV ======+====== OpenCV ​======
   * [[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 =====
 +
 +
 +==== Operadores entre imágenes ====
   * Podemos combinar dos imágenes: ''​cv::​add(image1,​ image2, result)''​   * Podemos combinar dos imágenes: ''​cv::​add(image1,​ image2, result)''​
   * Podemos combinar dos imágenes según pesos: ''​cv::​addWeighted(image1,​ 0.7, image2, 0.9, 0.0, result);''​   * Podemos combinar dos imágenes según pesos: ''​cv::​addWeighted(image1,​ 0.7, image2, 0.9, 0.0, result);''​
   * Podemos multiplicar una imagen por un escalar (k): ''​cv::​add(image1,​ cv::​Scalar(k),​ result);''​   * Podemos multiplicar una imagen por un escalar (k): ''​cv::​add(image1,​ cv::​Scalar(k),​ result);''​
   * Podemos combinar la primera imagen con un escalar y luego sumar la segunda: ''​cv::​scaleAdd(image1,​ k, image2, result)''​   * Podemos combinar la primera imagen con un escalar y luego sumar la segunda: ''​cv::​scaleAdd(image1,​ k, image2, result)''​
-En OpenCV existe sobreescritura de operadores, podemos aplicar los operadores bitwise (''&​ \ ^ ~ ''​),​ los de comparación (''<​nowiki><​ <= == != > >​=</​nowiki>''​)+  * Podemos aplicar un operador según la máscara: ''​cv::​add(image1,​ image2, result, mask)''​ 
 +  * Podemos usar operaciones de bitwise: ''​cv::​bitwise_and'',​ ''​cv::​bitwise_or'',​ ''​cv::​bitwise_xor''​ y ''​cv::​bitwise_not''​. 
 +  * Podemos usar otras funciones a parte del ''​add''​ tales como: ''​cv::​substract'',​ ''​cv::​absdiff'',​ ''​cv::​multiply''​ y ''​cv::​divide''​. 
 +  * Existen otros operadores que únicamente se aplican a una imagen: ''​cv::​sqrt'',​ ''​cv::​pow'',​ ''​cv::​abs'',​ ''​cv::​cuberoot'',​ ''​cv::​exp''​ y ''​cv::​log''​. 
 +En OpenCV existe sobreescritura de operadores, podemos aplicar los operadores bitwise (''&​ \ ^ ~ ''​),​ los de comparación (''<​nowiki><​ <= == != > >​=</​nowiki>''​)... 
 +<code cpp> 
 +result = 0.7 * image1 + 0.9 * image2; 
 +</​code>​ 
 + 
 + 
 + 
 +==== 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 =====
fw/opencv2.1309541666.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)