OpenCV--图片的读取、显示、保存、颜色转换、翻转、复制

本文介绍OpenCV基本函数库的一些调用

以下使用的cv_imgshow函数是自定义封装显示图片函数

一、OpenCV读取图片

语法:

retval = cv.imread( filename[, flags] )

  • filename: 图片路径;
  • flags:读取图片形式,有三种读取形式。
    • cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1;
    • cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0;
    • cv2.IMREAD_UNCHANGED:用图片的原来格式打开,即以不改变图片的方式打开,图片是彩色就是彩色,图片是灰度图像就是灰度图像,可以直接写-1。

Note:注意OpenCV读取的图片的颜色通道为BGR的排列方式
cv2.imread在不加第二个参数的情况下默认将图片转换成了一个三维数组,最里面的一维代表的是一个像素的三个通道的灰度值,第二个维度代表的是第一行所有像素的灰度值,第三个维度,也就是最外面的一个维度代表的是这一张图片。
示例:

import cv2 as cv  #引入库,version:4.1.2
#读取图片
img = cv.imread('cat.jpg', cv.IMREAD_COLOR) # 读取为彩色图片
img2 = cv.imread('cat.jpg', 0)  #读取为灰度图片
print(img)
print(img2)
print(img.shape)
print(img2.shape)
[[[142 151 160]
  [146 155 164]
  [151 160 170]
  ...
  [156 172 185]
  [155 171 184]
  [154 170 183]]
  ...
  [156 169 183]
  [155 168 182]
  [154 167 181]]
 ...
 [[154 178 190]
  [154 178 190]
  [121 145 157]
  ...
  [183 198 200]
  [128 143 145]
  [127 142 144]]]
[[153 157 162 ... 174 173 172]
 [119 124 129 ... 173 172 171]
 [120 124 130 ... 172 171 170]
 ...
 [187 182 167 ... 202 191 170]
 [165 172 164 ... 185 141 122]
 [179 179 146 ... 197 142 141]]
(414, 500, 3)
(414, 500)
二、图像显示

语法:

None = cv.imshow( winname, mat )
retval = cv.waitKey( [, delay] )
None = cv.destroyWindow( winname )

  • winname:图片窗口名称;
  • mat:要显示的图像(imread读入的图像名)。
  • cv2.waitKey顾名思义等待键盘输入,单位为毫秒,即等待指定的毫秒数看是否有键盘输入,若在等待时间内按下任意键则返回按键的ASCII码,程序继续运行。若没有按下任何键,超时后返回-1。参数为0表示无限等待。不调用waitKey的话,窗口会一闪而逝,看不到显示的图片。
  • cv2.destroyAllWindow()销毁所有窗口
  • cv2.destroyWindow(wname)销毁指定窗口
#图片的显示,也可以创建多个窗口,
cv.imshow('cat_gray', img2)
cv.imshow('cat', img)
a = cv.waitKey(0) 
cv.destroyAllWindows()
print(a)

-1

三、图片保存

语法:

retval = cv.imwrite( filename, img[, params] )

  • filename:保存的文件路径名;
  • img:需要保存的图片;
  • params:可选参数,为一个列表,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3。
    • cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int
    • cv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小。
#图片的保存 
cv.imwrite("cat_jpg.jpg", img, [int(cv.IMWRITE_JPEG_QUALITY), 95])

True

四、计算图片中的像素点
#计算图像中的像素点个数
img.size

621000

#像素点的类型
img.dtype

dtype(‘uint8’)

五、图像翻转

语法:

dst = cv.flip( src, flipCode[, dst] )

  • src:需要翻转的图片;
  • flipCode:翻转的方向。
    • flipcode = 0:沿x轴翻转
    • flipcode > 0:沿y轴翻转
    • flipcode < 0:x,y轴同时翻转

示例:

imgflip_xy = cv.flip(img, -1)
cv_imgshow('cat_flip_xy', imgflip_xy)
六、图片复制

示例:

#图片复制
img_copy = img.copy()
cv_imgshow("cat_copy", img_copy)

七、图片颜色转换

语法:

dst = cv.cvtColor( src, code[, dst[, dstCn]] )

  • src:待转换颜色的图片;
  • code:颜色空间转换嘛。

转化码参考官网:OpenCV

Note:将灰度图转为3通道的彩色图,实际转换之后显示仍然是灰色的,但电脑认定为彩色图3通道。

示例:

#彩色图像转为灰度图像
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY) 

#灰度图像转为彩色图像
#将灰度图转为3通道的彩色图,实际转换之后仍然是灰色的,电脑认定为彩色图
img_rgb = cv.cvtColor(img_gray, cv.COLOR_GRAY2RGB)
img_rgb.shape

(414, 500, 3)

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用OpenCV-Python库识别石头剪刀布手势的示例代码: ```python import cv2 import numpy as np import math # 定义区域的颜色上下限 lower = np.array([0, 20, 70], dtype=np.uint8) upper = np.array([20, 255, 255], dtype=np.uint8) # 开启摄像头 cap = cv2.VideoCapture(0) while True: # 读取一帧 ret, frame = cap.read() if not ret: break # 镜像翻转 frame = cv2.flip(frame, 1) # 转换到HSV空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 创建掩膜 mask = cv2.inRange(hsv, lower, upper) # 进行图像形态学操作 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11, 11)) mask = cv2.erode(mask, kernel, iterations=2) mask = cv2.dilate(mask, kernel, iterations=2) # 找到轮廓 contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 如果找到了轮廓 if len(contours) > 0: # 找到最大的轮廓 contour = max(contours, key=cv2.contourArea) # 计算轮廓的外接圆 ((x, y), radius) = cv2.minEnclosingCircle(contour) # 计算轮廓的重心 M = cv2.moments(contour) center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) # 绘制重心和外接圆 cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2) cv2.circle(frame, center, 5, (0, 0, 255), -1) # 如果半径大于10 if radius > 10: # 计算手势方向 rect = cv2.minAreaRect(contour) box = cv2.boxPoints(rect) box = np.int0(box) cv2.drawContours(frame, [box], 0, (0, 255, 0), 2) x1, y1 = box[0] x2, y2 = box[1] angle = math.atan2(y2 - y1, x2 - x1) * 180.0 / math.pi if angle < 0: angle += 180 if angle <= 60: gesture = "scissors" elif angle <= 120: gesture = "rock" else: gesture = "paper" # 在屏幕上显示手势 cv2.putText(frame, gesture, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 2) # 显示结果 cv2.imshow("Frame", frame) cv2.imshow("Mask", mask) # 按下q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头 cap.release() # 关闭所有窗口 cv2.destroyAllWindows() ``` 代码中使用红色的石头剪刀布手势进行演示,可以根据实际情况调整颜色区间。使用此代码时需要安装OpenCV-Python库,可以通过以下命令进行安装: ``` pip install opencv-python ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值