OpenCV Quick Start 1: lectura y almacenamiento de imágenes

Uno: Introducción a OpenCV

OpenCV es una biblioteca de software de aprendizaje automático y visión por computadora multiplataforma lanzada bajo la licencia Apache 2.0 (código abierto), que puede ejecutarse en los sistemas operativos Linux, Windows, Android y Mac OS. [1] Es liviano y eficiente: consta de una serie de funciones de C y una pequeña cantidad de clases de C++, proporciona interfaces para lenguajes como Python, Ruby y MATLAB, e implementa muchos algoritmos de propósito general en el procesamiento de imágenes. y visión por computadora.
OpenCV está escrito en lenguaje C++, tiene interfaces C++, Python, Java y MATLAB, y es compatible con Windows, Linux, Android y Mac OS. OpenCV se inclina principalmente por aplicaciones de visión en tiempo real y utiliza instrucciones MMX y SSE cuando están disponibles. , y ahora también brinda soporte para C#, Ch, Ruby, GO.

1: instalación de pycharm

Xiaoqi está usando pycharm2021.3 aquí (lo compré en Xixi 3.9 y el tutorial de instalación también está incluido)
Enlace: https://pan.baidu.com/s/1VfODGTu2f9foyNBKFtyG3w?pwd=4869
Código de extracción: 4869
Esto es Xiaoqi Si está interesado en los complementos descargados, puede echar un vistazo
Complemento recomendación_0
Complemento recomendado_1

Dos: Python instala OpenCV

Después de instalar pycharm, podemos ejecutar el siguiente comando en la terminal para instalar NumPy:

pip install numpy

Luego instale OpenCV, puede elegir dos versiones diferentes:

Instale solo el paquete del módulo principal

pip install opencv-python

Instale el paquete completo (incluidos los módulos principales y complementarios)

pip install opencv-contrib-python

En ese momento, el último opencv era 4.5.2, por lo que esta serie se ejecutaba en 4.5.2

Tres: API relacionada con la visualización de ventanas

namedWindow()		#窗口命名
imshow()			#窗口显示
destoryALLWindows() #销毁所有窗口
resizeWindow()		#窗口显示大小更改

Cuatro: código fuente

1: Leer, mostrar y guardar imágenes

import cv2

img =cv2.imread(r'C:\Users\DMr\Pictures\Saved Pictures\gary.jpg')#读取
cv2.namedWindow('xianshi',cv2.WINDOW_NORMAL)#命名
cv2.resizeWindow('xianshi',640,480)#改变窗口大小
while True:
    cv2.imshow('xianshi',img)

    key=cv2.waitKey(0)#接收按键信息---16位
    if (key&0xff ==ord('q')):#esc退出--取key的最后八位
        break
    elif(key&0xff==ord('s')):#按下s保存图片
        cv2.imwrite(r'C:\Users\DMr\Pictures\cai\text.jpg',img)#保存的路径与要保存的图片
    else:
        print(key)
        
cv2.destroyAllWindows()#销毁所有窗口

producción
Visualización de imágenes

2: One Mat muestra varias imágenes

//c++
Mat src1 = imread("D:/images/1.png");
Mat src2 = imread("D:/images/t3.jpg");
imshow("src1", src1);imshow("src2", src2);
// 构建新图像的大小
int width = src1.cols + src2.cols;
int height = max(src1.rows, src2.rows);
Mat two = Mat::zeros(Size(width, height), src1.type());// 构建ROI
Rect r1(0, 0, src1.cols, src1.rows);
Rect r2(0, 0, src2.cols, src2.rows);
r2.x = src1.cols;
// 内容copy
src1.copyTo(two(r1));
src2.copyTo(two(r2));
imshow("two images demo", two);
waitKey(0);

3: mapa de lectura cíclica

//c++
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

Mat img;
int ImgNum = 6;
char filename[50];
char a[300]; 

int main(){
    
    
	for (int i = 0; i < ImgNum; i++) //循环读入图片 
	{
    
    
		sprintf(filename, "C:\\Users\\DMr\\Pictures\\cai\\%d.jpg", i);
		img = imread(filename,0);//0灰度,1原图

		if (img.empty())
		{
    
    
			cout << "图像加载失败!\n" << endl;
			return -1;
		}
        else
    		cout << "图像加载成功!" << endl << endl;
		namedWindow("huidu", WINDOW_NORMAL);
		int b = 0;
		for (int n = 0; n < ImgNum; n++) {
    
    
			sprintf(a, "C:\\Users\\DMr\\Pictures\\vs_baocun\\text%d.jpg",b++);
			imwrite(a, img);
		}
		imshow("huidu", img);//显示图片
		waitKey(1000);
	}
	
//waitKey(0);	
return 0;	
}
import os
import cv2
'''
读取文件夹下图片并保存到指定路径从   
'''
def read_path(file_pathname):
    #遍历该目录下的所有图片文件
    for filename in os.listdir(file_pathname):
        print(filename)#文件名
        img = cv2.imread(file_pathname+'/'+filename)
        ####change to gray
      #(下面第一行是将RGB转成单通道灰度图,第二步是将单通道灰度图转成3通道灰度图)不需要这种操作只需注释掉即可
        img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

        cv2.imshow('s',img)
        key = cv2.waitKey(0)  # 接收按键信息---16位
        if (key & 0xff == ord('q')):  # esc退出--取key的最后八位
            break
        elif (key & 0xff == ord('s')):  # 按下s保存图片
            cv2.imwrite(r'C:\Users\DMr\Pictures\cai'+"/"+filename, img)  # 保存的路径与要保存的图片
        else:
            print(key)


        cv2.destroyAllWindows()  # 销毁所有窗口

#读取的目录
read_path("D:\\Pictures\\text")  # vscode里面读取图片文件夹的正确方式,pycharm里不知道。。。。
#print(os.getcwd())


el alcalde
Visualización de efectos de posición de lectura
inserte una descripción de la imagen aquí

4: Leer imágenes de tipo punto flotante

Mat m2;
src.convertTo(m2, CV_32F, 0.00392);
imshow("m2", m2);

Es solo que se agrega un parámetro más durante la conversión de tipo. Este parámetro es 1/255 = 0.00392, lo que
significa convertir el valor de píxel de 0 a 255 a un número de coma flotante entre 0 y 1, y luego mostrarlo. La pantalla El resultado corresponde al extremo derecho de la imagen de arriba.
Explicación: Cuando imshow muestra números de punto flotante, solo admite la visualización de números de punto flotante entre 0 y 1. Si excede 1, se considera blanco. Por lo tanto, cuando el rango de valores no se reescala, el número de punto flotante El tapete en el medio solo se puede mostrar en blanco. .

Cinco: resolución de problemas

Si la salida:
error: (-215: Afirmación fallida) size.width>0 && size.height>0 en la función 'cv::imshow'
puede ser un problema con la ruta de la imagen, puede echar un buen vistazo a la imagen camino

Razones comunes por las que falla la lectura de imágenes :

  1. La ruta puede contener chino
  2. Hay un problema con la ruta, como: "C:\Users\DELL\Pictures\b80592ef7330bd59f63bdef7fb6ef0f.jpg" se
    puede cambiar a r"C:\Users\DELL\Pictures\b80592ef7330bd59f63bdef7fb6ef0f.jpg"
    o "C:\Users \DELL\Pictures\b8059 2ef7330bd59f63bdef7fb6ef0f.jpg"
    o "C:/Usuarios/DELL/Pictures/b80592ef7330bd59f63bdef7fb6ef0f.jpg"

\ es el significado del carácter de escape en python

1: lectura y guardado de rutas chinas

Uso de la ruta en inglés (error): no se informará ningún error al leer en este momento, el img está vacío y se informará un error en algunas operaciones posteriores

img = cv2.imread("含有中文路径的图片.jpg")

usar correctamente

img = cv2.imdecode(np.fromfile("含有中文路径的图片.jpg",dtype=np.uint8),-1)

Correspondiente al parámetro -1 en el código: cv2.IMREAD_UNCHANGED(-1):
Como sugiere el nombre, lea la imagen completa, incluido el canal alfa. Si los datos no contienen un canal alfa, la imagen gris se lee como (H, W) y la imagen en color se lee como (H, W, 3).
cv2.IMREAD_GRAYSCALE(0): Lee una imagen en escala de grises con forma de (H, W). Las imágenes en color también se leen como formas grises.
cv2.IMREAD_COLOR (1): el parámetro predeterminado, se lee en una imagen en color, ignora el canal alfa y la forma es (H, W, 3). Los mapas grises también se leen como formas coloreadas.

2: Guarde la imagen con la ruta china (imwrite)

#img为需要保存的图片
cv2.imwrite("含有中文路径的图片.jpg", img)#(错误)

usar correctamente

# cv2.imencode(保存格式, 保存图片)[1].tofile(保存路径)
cv2.imencode('.jpg', img)[1].tofile("含有中文路径/xxx.jpg")

Si tiene alguna pregunta, deje un mensaje en el área de comentarios y avancemos juntos.

"Gran pastel" diario:
si decide que las espléndidas montañas están despejadas y el mar está despejado

Supongo que te gusta

Origin blog.csdn.net/weixin_52051554/article/details/125758858
Recomendado
Clasificación