怎样在树莓派上使用OpenCV绘制不同的几何形状并识别面部特征

电子说

1.3w人已加入

描述

Python代码绘制几何形状

下面的代码将在黑色图像上绘制线条,椭圆,圆形,矩形,折线和文字。复制此代码并执行它。我们将详细介绍代码如何在下面工作。

import cv2

import numpy as np

# Create a black image

img = np.zeros((512, 512, 3), np.uint8)

# img = cv2.line(image, (starting point), (Ending point), (color), line thickness)

img = cv2.line(img, (0, 256), (512, 256), (255, 0, 0), 10)

# cv2.Ellipse(img, center, axes, angle, start_angle, end_angle, color, thickness=1)

img = cv2.ellipse(img,(256,256),(50,50),180,0,180,(255, 255, 0),-1)

img = cv2.ellipse(img,(256,256),(50,50),0,0,180,(0, 255, 0),-1)

# cv2.Circle(img, center, radius, color, thickness)

img = cv2.circle(img, (256, 256), 56, (0, 0, 255), 10)

# img = cv2.rectangle(image, (Top Left Corner), (Bottom Right Corner), (color), thickness)

img = cv2.rectangle(img, (189, 189), (323, 323), (0, 255, 0), 10)

# cv2.PolyLine(img, polys, is_closed, color, thickness=1)

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)

pts = pts.reshape((-1,1,2))

img = cv2.polylines(img,[pts],True,(0,255,255))

# cv2.PutText(img, text, org, fontFace, fontScale, color, thickness, line type)

font = cv2.FONT_HERSHEY_SIMPLEX

cv2.putText(img,‘OpenCV’,(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)

# Create the resizeable window

cv2.namedWindow(‘image’, cv2.WINDOW_NORMAL)

cv2.imshow(‘image’, img)

cv2.waitKey(0)

cv2.destroyAllWindows()

运行代码将打开此输出:

代码细分

首先,我们导入所需的软件包。 OpenCV包帮助我们绘制不同的几何形状,NumPy包允许我们创建一个空白图像并进行其他数学运算。

import cv2

import numpy as np

接下来,我们创建一个黑色图像,我们可以在其上绘制几何图形形状。

img = np.zeros((512, 512, 3), np.uint8)

然后我们使用 cv2.line() 函数绘制一条厚度为5像素的蓝色对角线。我们将在中心左侧到中间右侧的黑色图像上画一条蓝线。

cv2.line() 函数有五个参数:

图像文件

起点(图像线上将开始的位置)

结束点

颜色的行

行的粗细

#img = cv2.line(image, (starting point), (Ending point), (color), line thickness)

img = cv2.line(img, (0, 256), (512, 256), (255, 0, 0), 10)

现在,我们将在图像的中心绘制两个椭圆。要绘制椭圆,我们需要传递几个参数:

图像文件

中心位置(x,y)

主要和短轴长度

椭圆沿逆时针方向的旋转角度

开始和结束角度(起始和结束角度表示椭圆弧的起点和终点从长轴顺时针方向,即给出值0和360给出完整的椭圆)

椭圆的颜色

椭圆的厚度(-1表示它将填充形状)

#cv2.ellipse(img, center, axes, angle, start angle, end angle, color, thickness=1)

img = cv2.ellipse(img,(256,256),(50,50),180,0,180,(255, 255, 0),-1)

img = cv2.ellipse(img,(256,256),(50,50),0,0,180,(0, 255, 0),-1)

接下来,我们将在椭圆上绘制一个红色圆圈。要画一个圆,我们需要传递图像文件,中心坐标,圆的半径,(B,G,R)格式的颜色和圆的厚度。

#cv2.Circle(img, center, radius, color, thickness)

img = cv2.circle(img, (256, 256), 56, (0, 0, 255), 10)

之后,我们在圆圈上画一个绿色矩形。要绘制矩形,您需要矩形的左上角和右下角。

#img = cv2.rectangle(image, (Top Left Corner), (Bottom Right Corner), (color), thickness)

img = cv2.rectangle(img, (189, 189), (323, 323), (0, 255, 0), 10)

要绘制多边形,我们需要顶点的坐标。将这些点组成一个形状为ROWS x 1 x 2的数组,其中ROWS是顶点数,它应该是int32类型。

这里我们绘制一个带有四个黄色顶点的小多边形。

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)

pts = pts.reshape((-1,1,2))

# cv2.PolyLine(img, polys, is_closed, color, thickness=1)

img = cv2.polylines(img,[pts],True,(0,255,255))

要将文本放入图像中,我们需要提供想要写入的文本数据,我们想要放置它的位置坐标(即数据开始的左下角),字体类型,字体比例(指定字体大小),颜色,粗细和线型。

#cv2.PutText(img, text, org, fontFace, fontScale, color, thickness, line type)

font = cv2.FONT_HERSHEY_SIMPLEX

cv2.putText(img,‘OpenCV’,(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)

用于检测面部和在面上绘制圆形的Python代码

现在我们将编写将检测面部中的面部的代码图像并在脸部周围绘制圆圈。为了检测面部,我们将使用Haar级联分类器。 OpenCV已经包含许多面部,眼睛,微笑等预先训练的分类器。我们将要使用的分类器将检测面部。您可以获得级联文件。

将此文件保存在工作目录中作为“ haarcascade_frontalface_default.xml ”。

Python代码如下:

# Import OpenCV library

import cv2

# Load a cascade file for detecting faces

faceCascade = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”);

# Load image

image = cv2.imread(‘obamafamily.jpg’)

# Convert into grayscale

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Look for faces in the image using the loaded cascade file

faces = faceCascade.detectMultiScale(gray, 1.2, 5)

for (x,y,w,h) in faces:

# Create circle around faces

cv2.circle(image, (int((x + x + w)/2), int((y + y + h)/2)), int(h/2), (0, 255, 0), 5)

# Create the resizeable window

cv2.namedWindow(‘Obama’, cv2.WINDOW_NORMAL)

# Display the image

cv2.imshow(‘Obama’, image)

# Wait until we get a key

k=cv2.waitKey(0)

# If pressed key is ‘s’

if k == ord(‘s’):

# Save the image

cv2.imwrite(‘convertedimage.jpg’, image)

# Destroy all windows

cv2.destroyAllWindows()

# If pressed key is ESC

elif k == 27:

# Destroy all windows

cv2.destroyAllWindows(

运行代码后,程序会在图像中检测到的区域创建圆圈。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分