文章目录
- 前言
- 一、作业内容
- 二、思路
- 1.引入库
- 2.读入图片
- 3.转换到HSV
- 4. 设定红色的阈值
- 5. 根据阈值构建掩模
- 6. 对原图像和掩模进行位运算
- 7.显示图像
- 8.旋转
- 总结
前言
这次是OpenCV的第三次作业了。
一、作业内容
通过追踪颜色的hsv值,使画面只留下长方形,在进行二值化,并通过对图片几何变换使长方形摆正
二、思路
一步步来,主要是设置好红色的阈(yù)值
1.引入库
代码如下:
import cv2
import numpy as np
2.读入图片
代码如下:
img_path = './img3/findURRectangle.jpg'
img = cv2.imread(img_path)
3.转换到HSV
代码如下:
# 转换到 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
4. 设定红色的阈值
对于HSV色域,各种颜色可参考
代码如下:
# 设定红色的阈值
low_H = 156
upper_H = 180
low_S = 43
upper_S = 255
low_V = 46
upper_V = 255
lower_red = np.array([low_H, low_S, low_V])
upper_red = np.array([upper_H, upper_S, upper_V])
5. 根据阈值构建掩模
代码如下:
# 根据阈值构建掩模
mask = cv2.inRange(hsv, lower_red, upper_red)
6. 对原图像和掩模进行位运算
代码如下:
# 对原图像和掩模进行位运算
res = cv2.bitwise_and(img, img, mask=mask)
7.显示图像
代码如下:
# 显示图像
cv2.imshow('img', img)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
如下图所示:
8.旋转
使用OpenCV的旋转矩阵进行旋转,需要用到下面形式的公式
但OpenCV运行你在任意地方旋转,但是旋转矩阵的形式应该修改为
代码如下:
# 获取图片的大小
rows, cols, channels = res.shape
# 对红色矩形进行旋转
# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M = cv2.getRotationMatrix2D((cols/2, rows/2), 161, 0.8)
# 第三个参数是输出图像的尺寸中心
dst = cv2.warpAffine(res, M, (2*cols, 2*rows))
绕图片中心旋转161°后是这样
所有代码如下:
import cv2
import numpy as np
img_path = './img3/findURRectangle.jpg'
img = cv2.imread(img_path)
while 1:
# 转换到 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 设定红色的阈值
low_H = 156
upper_H = 180
low_S = 43
upper_S = 255
low_V = 46
upper_V = 255
lower_red = np.array([low_H, low_S, low_V])
upper_red = np.array([upper_H, upper_S, upper_V])
# 根据阈值构建掩模
mask = cv2.inRange(hsv, lower_red, upper_red)
# 对原图像和掩模进行位运算 取出长方形
res = cv2.bitwise_and(img, img, mask=mask)
# 获取图片的大小
rows, cols, channels = res.shape
# 对红色矩形进行旋转
# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M = cv2.getRotationMatrix2D((cols/2, rows/2), 161, 0.8)
# 第三个参数是输出图像的尺寸中心
dst = cv2.warpAffine(res, M, (cols, rows))
# 显示图像
# cv2.imshow('img', img)
# cv2.imshow('mask', mask)
cv2.imshow('img', dst)
cv2.imshow('res', res)
k = cv2.waitKey(0) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
总结
以上就是今天要的内容,本文仅仅简单介绍了通过追踪颜色的hsv值,使画面只留下长方形。并进行二值化后再将图片进行几何变换使长方形摆正。