OpenCV快速入门一:图片读取&保存

一:OpenCV介绍

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。

1: pycharm安装

小柒这里用的是pycharm2021.3 (某夕夕3.9买的,安装教程也在里面)
链接:https://pan.baidu.com/s/1VfODGTu2f9foyNBKFtyG3w?pwd=4869
提取码:4869
这是小柒下载的几个插件感兴趣的可以看看
插件推荐_0
插件推荐_1

二:Python安装OpenCV

安装好pycharm后我们可以在终端中运行以下命令安装 NumPy:

pip install numpy

然后再安装 OpenCV,可以选择两种不同版本:

仅安装主模块包

pip install opencv-python

安装完整包(包括主模块和附加模块)

pip install opencv-contrib-python

我那时候opencv最新是4.5.2,所以这个系列都是在4.5.2上运行的

三:窗口显示相关API

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

四:源代码

1:读取、显示与保存图像

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()#销毁所有窗口

输出
图片显示

2:一个Mat显示多张图片

//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:循环读图

//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())

读取位置
duqu
效果显示
在这里插aa入图片描述

4:读取浮点类型图片

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

只是在类型转换的时候多加了一个参数,这个参数是 1/255 = 0.00392
意思是把像素值从0~255 转换为0~1之间的浮点数,然后再显示,显示结果对应上图最右侧。
解释:原来imshow显示浮点数的时候,只支持0~1之间的浮点数显示,超过1就认为是白色,所以在没有对值域做rescale的时候,中间的浮点数Mat显示只能是白色。

五:问题解决

如果输出:
error: (-215:Assertion failed) size.width>0 && size.height>0 in function ‘cv::imshow’
则可能是图片路径有问题,可以好好看一下图片路径

图片读取失败常见原因

  1. 路径中可能含有中文
  2. 路径有问题如:“C:\Users\DELL\Pictures\b80592ef7330bd59f63bdef7fb6ef0f.jpg”
    可改为 r"C:\Users\DELL\Pictures\b80592ef7330bd59f63bdef7fb6ef0f.jpg"
    或者"C:\Users\DELL\Pictures\b80592ef7330bd59f63bdef7fb6ef0f.jpg"
    亦或是"C:/Users/DELL/Pictures/b80592ef7330bd59f63bdef7fb6ef0f.jpg"

python中 \是转义字符的意思

1:中文路径读取与保存

英文路径使用(错误):此时读取时不会报错,img中是空的,在后续的一些操作中才会报错

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

正确使用

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

对应代码中的-1参数: cv2.IMREAD_UNCHANGED(-1):
顾名思义,读入完整图片,包括alpha通道。如果数据不含alpha通道则灰图读成(H, W),彩图读成(H, W, 3)。
cv2.IMREAD_GRAYSCALE(0): 读入灰度图片,形状为(H, W)。彩图也读成灰的形状。
cv2.IMREAD_COLOR(1): 默认参数, 读入一幅彩色图片,忽略alpha通道, 形状为(H, W, 3)。灰图也读成彩的形状。

2:保存含有中文路径的图片(imwrite)

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

正确使用

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

如果还有问题欢迎评论区留言,共同进步

每日“大饼”:
若你决定灿烂 山无遮 海无拦

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氿 柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值