7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列
Posted 小嗷的日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列相关的知识,希望对你有一定的参考价值。
简书链接:https://www.jianshu.com/u/45da1fbce7d0
关键词:基本图形的绘制
点的表示:Point类 (用点来表示找到特征点)
颜色的表示:Scalar类(设置颜色)
尺寸的表示:Size类(测距用到)
矩阵的表示:Rect类(ROI经常用到)
圆的表示:circle函数(用圆来绘制出识别出来物体的区域)
矩形的表示:rectangle函数(用矩形来绘制出识别出来物体的区域)
直线的表示:line函数(比对两张图片特征点时,需要有line连在一起,方便观看)
还有多边形的fillPoly函数和椭圆elipse函数(眼睛识别)
3.1 Point(点)
Point(int x, int y) //初中数学平面图 X,Y轴上的两个坐标
Point pt1(20,30);
Point pt2;
pt2.x = 20;
pt2.y = 30;
3.2 Size(尺寸)
Size(int width, int height) //1.宽 2.高
Size size1(150, 100);
Size size2;
size2.width = 150;
size2.height = 100;
int myArea = size2.area();
尺寸類別,成員有width和height,分別表示寬和長(int型態),可用area()函式得到面積
3.3 Scalar(颜色)
Scalar(a, b, c):省略透明通道,由於OpenCV的彩色影像通常為BGR的順序,a代表藍色、b代表綠色、c代表紅色。
Scalar(a):通常用於灰階圖,像素強度為a。
3.4 Line(线)
C++: void line(Mat& img, Point pt1,Point pt2, const Scalar& color, int thickness=1, int lineType=8,int shift=0)
参数
img – 图像.
pt1 – 线条起点.
pt2 – 线条终点.
color – 线条颜色.
thickness – 线条宽度.
lineType – 线型
Type of the line: 8 (or omitted) - 8-连接线. (4 - 4-连接线.)(CV_AA - 反走样线条.)
shift – 坐标点小数点位数.
用途:特征点匹配
3.4 Rectangle(矩形)
C++: void rectangle(Mat& img,Point pt1, Pointpt2, const Scalar&color, intthickness=1,intlineType=8, intshift=0)
C++: void rectangle(Mat& img,Rect rec, const Scalar&color, intthickness=1, intlineType=8,intshift=0 )
参数
img – 画矩形的对象
pt1 – 矩形的一个顶点,左上角的.
pt2 – 另一个顶点,右下角的.
rec – 确定矩形的另一种方式,给左上角坐标和长宽
color – 指定矩形的颜色或亮度(灰度图像),scalar(255,0,255)既可指定.
thickness – 矩形边框的粗细. 负值(like CV_FILLED)表示要画一个填充的矩形
lineType – 边框线型. ( 8 (or 0) - 8-connected line(8邻接)连接线。4 - 4-connected line(4邻接)连接线。CV_AA - antialiased 线条。)
shift –坐标点的小数点位数
用途:用矩形来绘制出识别出来物体的区域
3.5 FillPoly(多边形)
C++: void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours,CvScalar color, int line_type=8, int shift=0 );
参数
img – 画矩形的对象
pts – 指向多边形的数组指针。
npts – 多边形的顶点个数的数组。
contours – 组成填充区域的线段的数量。
color – 指定多边形的颜色或亮度(灰度图像),scalar(255,0,255)既可指定.
lineType – 边框线型. ( 8 (or 0) - 8-connected line(8邻接)连接线。4 - 4-connected line(4邻接)连接线。CV_AA - antialiased 线条。)
shift –坐标点的小数点位数
用途:用多边形来绘制出识别出来眼睛的区域
3.6 circle (圆)
C++: void circle(Mat&img, Point center, intradius, const Scalar&color,intthickness=1, intlineType=8, intshift=0)
参数
img – 要画圆的那个矩形.
center – 圆心坐标.
radius – 半径.
color – 圆边框颜色,scalar类型的
thickness – 正值表示圆边框宽度. 负值表示画一个填充圆形
lineType – 圆边框线型
shift –坐标点的小数点位数
用途:用圆来绘制出识别出来眼睛的区域
3.7 Ellipse (椭圆)
C++: void ellipse(Mat& img, Point center,Size axes, double angle, double startAngle, double endAngle, const Scalar& color,int thickness=1, int lineType=8, int shift=0)
C++: void ellipse(Mat& img, constRotatedRect& box, const Scalar& color, int thickness=1, int lineType=8)
参数
img – 椭圆所在图像.
center – 椭圆中心.
axes – 椭圆主轴一半的长度
angle – 椭圆旋转角度
startAngle – 椭圆弧起始角度
endAngle –椭圆弧终止角度
box – 指定椭圆中心和旋转角度的信息,通过 RotatedRect 或 CvBox2D. 这表示椭圆画在旋转矩形上(矩形是不可见的,只是指定了一个框而已)
color – 椭圆边框颜色.
thickness – 正值代表椭圆边框宽度,负值代表填充的椭圆
lineType – 线型
shift – 椭圆中心坐标和坐标轴的小数点位数
用途:用椭圆来绘制出识别出来椭圆物体的区域
3.8 PutText(显示文字)
C++: void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )
参数
img – 显示文字所在图像.
text – 待显示的文字.
org – 文字在图像中的左下角 坐标.
font – 字体结构体.
fontFace – 字体类型,可选择字体(FONTHERSHEYSIMPLEX,FONTHERSHEYPLAIN, FONTHERSHEYDUPLEX,FONTHERSHEYCOMPLEX,FONTHERSHEYTRIPLEX, FONTHERSHEYCOMPLEXSMALL,FONTHERSHEYSCRIPTSIMPLEX, or FONTHERSHEYSCRIPTCOMPLEX,以上所有类型都可以配合 FONTHERSHEY_ITALIC使用,产生斜体效果。)
color – 文本颜色
thickness – 写字的线的粗细
lineType – 线型.
bottomLeftOrigin – true, 图像数据原点在左下角. Otherwise, 图像数据原点在左上角.
用途:这个经常用来显示你是谁?你多少岁?它是什么?
//---------------------------------【头文件、命名空间包含部分】----------------------------
// 描述:包含程序所使用的头文件和命名空间
// 这个例子来源opencv官网,不过我还是建议你的敲敲代码,毕竟以后识别会用到
//------------------------------------------------------------------------------------------------
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
// 此程序对于OpenCV3版需要额外包含头文件
#include<opencv2/imgproc/imgproc.hpp>
//-----------------------------------【宏定义部分】--------------------------------------------
// 描述:定义一些辅助宏
//------------------------------------------------------------------------------------------------
#define WINDOW_NAME1 "基本图形的绘制图1" //为窗口标题定义的宏
#define WINDOW_NAME2 "基本图形的绘制图2" //为窗口标题定义的宏
#define WINDOW_WIDTH 600 //定义窗口宽度 600
using namespace cv;
//--------------------------------【全局函数声明部分】-------------------------------------
// 描述:全局函数声明(相当于java中主类的方法),进一步封装API
//-----------------------------------------------------------------------------------------------
void DrawEllipse(Mat img,double angle);//绘制椭圆
void DrawFilledCircle(Mat img, Point center);//绘制圆
void DrawPolygon(Mat img);//绘制多边形
void DrawLine(Mat img,Point start,Point end);//绘制线段
//---------------------------------------【main( )函数】--------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main(void)
{
// 创建空白的Mat图像
Mat atomImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
Mat rookImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
// ---------------------<1>绘制化学中的原子示例图------------------------
//【1.1】先绘制出椭圆
DrawEllipse(atomImage, 90);
DrawEllipse(atomImage, 0);
DrawEllipse(atomImage, 45);
DrawEllipse(atomImage, -45);
//【1.2】再绘制圆心
DrawFilledCircle(atomImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2));
// ----------------------------<2>绘制组合图-----------------------------
//【2.1】先绘制出椭圆
DrawPolygon(rookImage);
// 【2.2】绘制矩形
rectangle(rookImage,
Point(0, 7 * WINDOW_WIDTH / 8),
Point(WINDOW_WIDTH, WINDOW_WIDTH),
Scalar(0, 255, 255),
-1,
8);
// 【2.3】绘制一些线段
DrawLine(rookImage, Point(0, 15 * WINDOW_WIDTH / 16), Point(WINDOW_WIDTH, 15 * WINDOW_WIDTH / 16));
DrawLine(rookImage, Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 4, WINDOW_WIDTH));
DrawLine(rookImage, Point(WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 2, WINDOW_WIDTH));
DrawLine(rookImage, Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH));
// ---------------------------<3>显示绘制出的图像------------------------
imshow(WINDOW_NAME1, atomImage);
moveWindow(WINDOW_NAME1, 0, 200);
imshow(WINDOW_NAME2, rookImage);
moveWindow(WINDOW_NAME2, WINDOW_WIDTH, 200);
waitKey(0);
return(0);
}
//-------------------------------【DrawEllipse( )函数】--------------------------------
// 描述:自定义的绘制函数,实现了绘制不同角度、相同尺寸的椭圆
//-----------------------------------------------------------------------------------------
void DrawEllipse(Mat img, double angle)
{
int thickness = 2;
int lineType = 8;
ellipse(img,
Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2),
Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16),
angle,
0,
360,
Scalar(255, 129, 0),
thickness,
lineType);
}
//-----------------------------------【DrawFilledCircle( )函数】---------------------------
// 描述:自定义的绘制函数,实现了实心圆的绘制
//-----------------------------------------------------------------------------------------
void DrawFilledCircle(Mat img, Point center)
{
int thickness = -1;
int lineType = 8;
circle(img,
center,
WINDOW_WIDTH / 32,
Scalar(0, 0, 255),
thickness,
lineType);
}
//-----------------------------------【DrawPolygon( )函数】--------------------------
// 描述:自定义的绘制函数,实现了凹多边形的绘制
//--------------------------------------------------------------------------------------
void DrawPolygon(Mat img)
{
int lineType = 8;
//创建一些点
Point rookPoints[1][20];
rookPoints[0][0] = Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
rookPoints[0][1] = Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
rookPoints[0][2] = Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
rookPoints[0][3] = Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
rookPoints[0][4] = Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
rookPoints[0][5] = Point(3 * WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
rookPoints[0][6] = Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
rookPoints[0][7] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][8] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][9] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][10] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][11] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][12] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][13] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][14] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][15] = Point(WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
rookPoints[0][16] = Point(WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
rookPoints[0][17] = Point(13 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
rookPoints[0][18] = Point(5 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
rookPoints[0][19] = Point(WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
const Point* ppt[1] = { rookPoints[0] };
int npt[] = { 20 };
fillPoly(img,
ppt,
npt,
1,
Scalar(255, 255, 255),
lineType);
}
//-----------------------------------【DrawLine( )函数】--------------------------
// 描述:自定义的绘制函数,实现了线的绘制
//---------------------------------------------------------------------------------
void DrawLine(Mat img, Point start, Point end)
{
int thickness = 2;
int lineType = 8;
line(img,
start,
end,
Scalar(0, 0, 0),
thickness,
lineType);
}
本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)
大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年
写文章主要是为了后人少走点弯路,多交点朋友,一起学习
如果有好的图像识别群拉我进去QQ:631821577
就我一个白板,最后还是成的,你们别怕,慢慢来把
分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。
邮箱:631821577@qq.com
以上是关于7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列的主要内容,如果未能解决你的问题,请参考以下文章