主要使用功能:
1.图像的载入、显示和保存
2.目标检测给图像加方框和对应的置信度(文字)并获得裁剪区域, 在裁剪区域叠加水印
运行环境 python3
1.安装:https://blog.csdn.net/liuweiyuxiang/article/details/80591640
重点命令:
* 1.cv2.imread 读取图像
img = cv2.imread(filename)
* 2.cv2.rectanle 加方框
cv2.rectangle(img,(int(sx1),int(sy1)),(int(sx2),int(sy2)),(0,255,0),3)
# 输入参数分别为图像、左上角坐标、右下角坐标、颜色数组、粗细
cv2.rectangle(img, (x,y), (x+w,y+h), (B,G,R), Thickness)
* 3.cv2.putText 加文字
cv2.putText(img, text, (int(sx1),int(sy1-6)), cv2.FONT_HERSHEY_COMPLEX_SMALL,0.8, (0, 255, 0) )
# 输入参数为图像、文本、位置、字体、大小、颜色数组、粗细
cv2.putText(img, text, (x,y), Font, Size, (B,G,R), Thickness)
* 4.cv2.write 保存处理后的图像(JPG, PNG)
注意: cv2.write的参数为3个(“save_filename”, img, [save_type, quality_level])
其中:save_type为jpg或png
当为存储为jpg时,save_type设置为cv2.IMWRITE_JPEG_QUALITY, quality_score从0~100,分数越大,表明质量u越好,当不选择第三个参数时,默认保存的质量分数为95。 注意,cv2.IMWRITE_JPEG_QUALITY类型为Long,必须转换成int。下面是以不同质量存储的两幅图:
# 针对jpg
# 不设置质量分数,默认为95
cv2.imwrite('new.jpg', img)
# 设置为质量分数,假设设置为100
cv2.imwrite('new.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
对于PNG,第三个参数表示的是压缩级别。cv2.IMWRITE_PNG_COMPRESSION,从0到9,压缩级别越高,图像尺寸越小。默认级别为3:
# 设置压缩等级为0
cv2.imwrite("new.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
# 设置压缩等级为9
cv2.imwrite("new.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
* 5. cv2.resize 修改图像的大小
利用opencv中的cv2.resize可以实现将原始图变换为指定的尺寸:、
三个参数:cv2.resize(源图像,目标大小,变换方法)
其中目标大小为元组,指定宽度和高度,width 与 height, (w, h)
变换方法:
CV_INTER_NEAREST:最近邻插值,
CV_INTER_LINEAR:双线性插值 (缺省使用)
CV_INTER_AREA:使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_ NEAREST方法..
CV_INTER_CUBIC:立方插值.
image=cv2.imread('test.jpg')
res=cv2.resize(image,(32,32),interpolation=cv2.INTER_CUBIC)
* 6. cv2.imshow 显示处理后的图像
cv2.imshow('001_new.jpg', img)
cv2.waitKey(0) # 鼠标点击图像 按空格键退出显示
cv2.destroyAllWindows()
二.根据坐标获得裁剪区域
在上一步得到对应的坐标(x1,x2,y1,y2)之后,想将框出来的区域取出来,这点在Matlab中是比较好实现,opencv同样可以做一样的事情,稍微有点区别。
hight = y2 - y1
width = x2 - x1
cropImg = image[y1:y1+hight, x1:x1+width]
可以看到,image[],左边是y坐标范围(从上到下坐标增大),右边是x坐标范围(从左到右坐标增大),与matlab相反,cropImg就代表想要的像素区域。
如果想循环读取:
for i in range(1,201):
if i==169 or i==189:
i = I+1
pth="C:\\Users\\Desktop\\asd\\"+str(i)+".bmp"
image = cv2.imread(pth) //从指定路径读取图像
cropImg = image[600:1200,750:1500] //获取感兴趣区域 cv2.imwrite("C:\\Users\\Desktop\\qwe\\"+str(i)+".bmp",cropImg) //保存到指定目录
三.在裁剪区域叠加水印
import cv2
img = cv2.imread('person.jpg')
logo = cv2.imread('logo.jpg')
logo_gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)
rows, cols, channels = logo.shape
sx1 = 202
sx2 = 258
sy1 = 241
sy2 = 325
dy = round((sx1 + sx2) / 2.0)
dx = round((sy1 + sy2) / 2.0)
roi = img[dx:dx+rows, dy:dy+cols]
cv2.rectangle(img, (int(sx1), int(sy1)), (int(sx2), int(sy2)), (0, 255, 0), 3)
for i in range(rows):
for j in range(cols):
if (int(logo[i, j][0]) + int(logo[i, j][1]) + int(logo[i, j][2])) <= 20:
roi[i, j] = roi[i, j]
else:
roi[i, j] = logo[i, j]
roi = cv2.addWeighted(logo, 0.5, roi, 0.5, 1)
# roi=cv2.add(logo, roi)
cv2.imshow('001_new.jpg', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
检测出裤子,并添加logo图
参考:
https://blog.csdn.net/xieqiaokang/article/details/60780608
https://jingyan.baidu.com/article/d5a880ebdd962f13f147ccb9.html