序
前面两篇文章我们讲了凸包和凸缺陷,这还是图像处理中,比较难理解的几个知识点。要用到一些循环,而且需要调试很多数据。并且运行代码时的报错,我是看都看不懂。所以说这几章内容还是要认真听讲。
宽高比
因为宽高比是图像轮廓中算比较简单的内容,所以用比较少的篇幅和例子来进行分享。
题1
让我们来获取这张手掌的宽高比
代码
#读出手图像的宽高比
import cv2
import numpy as np
o =cv2.imread("binaryhand.png")#读图
cv2.imshow("original",o)#展示凸包
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret,binary =cv2.threshold(gray,127,255,0)#阈值处理
contours,hierarchy =cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#查找轮廓
x,y,w,h =cv2.boundingRect(contours[0])
cv2.rectangle(o,(x,y),(x+w,y+h),(255,255,255),3)
aspectRatio = float(w)/h
print(aspectRatio)
cv2.imshow("result",o)#展示凸包
cv2.waitKey(0)
cv2.destroyAllWindows()
将这个代码运行之后,我们就获取了这个手掌的宽高比(0.6248294679399727)也是很简单。
图2
接下来就是连环题,题目虽然不同,但是我们用的图片是同一张。让我们分别获取图中横着的椭圆和竖着的椭圆的宽高比。这次难度增加了很多,不仅需要处理的图片增加了,而且形状也是不一样的。
上图
横椭圆
让我们先来获取横着的椭圆的宽高比。
代码
import cv2
import numpy as np
o =cv2.imread("face.png")#读图
cv2.imshow("original",o)#展示凸包
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret,binary =cv2.threshold(gray,127,255,0)#阈值处理
contours,hierarchy =cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#查找轮廓
for i in range(len(contours)):#循环
x,y,w,h =cv2.boundingRect(contours[i])#矩形的包围框
aspectRatio = float(w)/h#宽高比
rectArea=w*h#矩形面积
cntArea=cv2.contourArea(contours[i])#轮廓面积
extend=float(cntArea)/rectArea#占空比
print(extend)
if aspectRatio>0.8:#宽高比大于0.8
if 0.8>extend:#占空比小于0.8
cv2.rectangle(o,(x,y),(x+w,y+h),(255,255,255),3)#画出矩形
#print(aspectRatio)
cv2.imshow("result",o)#展示凸包
cv2.waitKey(0)
cv2.destroyAllWindows()
竖椭圆
代码部分
import cv2
import numpy as np
o =cv2.imread("face.png")#读图
cv2.imshow("original",o)#展示凸包
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret,binary =cv2.threshold(gray,127,255,0)#阈值处理
contours,hierarchy =cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#查找轮廓
for i in range(len(contours)):#循环
x,y,w,h =cv2.boundingRect(contours[i])#矩形的包围框
aspectRatio = float(w)/h#宽高比
rectArea=w*h#矩形面积
cntArea=cv2.contourArea(contours[i])#轮廓面积
extend=float(cntArea)/rectArea#占空比
print(extend)
if aspectRatio>0.8:#宽高比大于0.8
if 0.8>extend:#占空比小于0.8
cv2.rectangle(o,(x,y),(x+w,y+h),(255,255,255),3)#画出矩形
#print(aspectRatio)
cv2.imshow("result",o)#展示凸包
cv2.waitKey(0)
cv2.destroyAllWindows()
今天的分享就到这里
太累了
比谈恋爱还累
真的要死人了