整理了一下之前写的小例子,有几个还不错拿来分析一下。
例子一:画一个物体选框,标注类型以及相关参数。
///input:Point<xmin,ymin>,Point<xmax,ymax>,char * str(class),float depth,color
///output:(in display windows)a beatiful bounding-box
///output:(in display windows)a beatiful bounding-box
///头文件
#include <iostream>
#include <string>
#include <opencv2\core\core.hpp>
#include <opencv2\calib3d\calib3d.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <opencv2\core\core.hpp>
#include <opencv2\calib3d\calib3d.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <stdio.h>
#include <stdlib.h>
///矩形
void Draw_Rectangle(cv::Mat img, int xmin, int ymin, int xmax, int ymax, cv::Scalar &color, int thickness, int lineType)
{
cv::Point start, end;
start.x = xmin;
start.y = ymin;
end.x = xmax;
end.y = ymax;
rectangle(img, start, end, color, thickness, lineType);
}
///角标
void Draw_Corner(cv::Mat img, int xmin, int ymin, int xmax, int ymax, cv::Scalar &color, int interspace, int length)
{
cv::Point corner[5][5];
void Draw_Corner(cv::Mat img, int xmin, int ymin, int xmax, int ymax, cv::Scalar &color, int interspace, int length)
{
cv::Point corner[5][5];
///corner zero
corner[0][0] = cv::Point(xmin + interspace, ymin + interspace);///中间点
corner[0][1] = cv::Point(xmin + interspace, ymin + length + interspace);///同列
corner[0][2] = cv::Point(xmin + length + interspace, ymin + interspace);///同行
line(img, corner[0][0], corner[0][1], color);
line(img, corner[0][0], corner[0][2], color);
corner[0][0] = cv::Point(xmin + interspace, ymin + interspace);///中间点
corner[0][1] = cv::Point(xmin + interspace, ymin + length + interspace);///同列
corner[0][2] = cv::Point(xmin + length + interspace, ymin + interspace);///同行
line(img, corner[0][0], corner[0][1], color);
line(img, corner[0][0], corner[0][2], color);
///corner one
corner[1][0] = cv::Point(xmax - interspace, ymin + interspace);
corner[1][1] = cv::Point(xmax - interspace, ymin + length + interspace);
corner[1][2] = cv::Point(xmax - length - interspace, ymin + interspace);
line(img, corner[1][0], corner[1][1], color);
line(img, corner[1][0], corner[1][2], color);
corner[1][0] = cv::Point(xmax - interspace, ymin + interspace);
corner[1][1] = cv::Point(xmax - interspace, ymin + length + interspace);
corner[1][2] = cv::Point(xmax - length - interspace, ymin + interspace);
line(img, corner[1][0], corner[1][1], color);
line(img, corner[1][0], corner[1][2], color);
///corner two
corner[2][0] = cv::Point(xmax - interspace, ymax - interspace);
corner[2][1] = cv::Point(xmax - interspace, ymax - length - interspace);
corner[2][2] = cv::Point(xmax - length - interspace, ymax - interspace);
line(img, corner[2][0], corner[2][1], color);
line(img, corner[2][0], corner[2][2], color);
corner[2][0] = cv::Point(xmax - interspace, ymax - interspace);
corner[2][1] = cv::Point(xmax - interspace, ymax - length - interspace);
corner[2][2] = cv::Point(xmax - length - interspace, ymax - interspace);
line(img, corner[2][0], corner[2][1], color);
line(img, corner[2][0], corner[2][2], color);
///corner three
corner[3][0] = cv::Point(xmin + interspace, ymax - interspace);
corner[3][1] = cv::Point(xmin + interspace, ymax - length - interspace);
corner[3][2] = cv::Point(xmin + length + interspace, ymax - interspace);
line(img, corner[3][0], corner[3][1], color);
line(img, corner[3][0], corner[3][2], color);
}
corner[3][0] = cv::Point(xmin + interspace, ymax - interspace);
corner[3][1] = cv::Point(xmin + interspace, ymax - length - interspace);
corner[3][2] = cv::Point(xmin + length + interspace, ymax - interspace);
line(img, corner[3][0], corner[3][1], color);
line(img, corner[3][0], corner[3][2], color);
}
///十字星
void Draw_Cross(cv::Mat img, int xmin, int ymin, int xmax, int ymax, cv::Scalar &color, int length)
{
void Draw_Cross(cv::Mat img, int xmin, int ymin, int xmax, int ymax, cv::Scalar &color, int length)
{
cv::Point middle;
middle.x = (xmax - xmin) / 2 + xmin;
middle.y = (ymax - ymin) / 2 + ymin;
cv::Point points_group[4];
points_group[0] = cv::Point(middle.x - length, middle.y);
points_group[1] = cv::Point(middle.x + length, middle.y);
points_group[2] = cv::Point(middle.x, middle.y + length);
points_group[3] = cv::Point(middle.x, middle.y - length);
line(img, points_group[0], points_group[1], color);
line(img, points_group[2], points_group[3], color);
}
middle.x = (xmax - xmin) / 2 + xmin;
middle.y = (ymax - ymin) / 2 + ymin;
cv::Point points_group[4];
points_group[0] = cv::Point(middle.x - length, middle.y);
points_group[1] = cv::Point(middle.x + length, middle.y);
points_group[2] = cv::Point(middle.x, middle.y + length);
points_group[3] = cv::Point(middle.x, middle.y - length);
line(img, points_group[0], points_group[1], color);
line(img, points_group[2], points_group[3], color);
}
///标签:标记类别
///标记距离
void Draw_Target(cv::Mat img, int xmin, int ymin, int xmax, int ymax, cv::Scalar &color, float depth, const char *classname, int thickness, int lineType)
{
char depth_buffer[10];
sprintf(depth_buffer, "%.2f m", depth);
int dx = xmax - xmin, dy = ymax - ymin;
int baselineT = 0;
cv::Size grapT = cv::getTextSize(classname, 4, 1, thickness, &baselineT);
int baseline = 0;
cv::Size grap = cv::getTextSize(depth_buffer, 4, 1, thickness, &baseline);
cv::Point class_point;///左底的点
cv::Point depth_point;///左底的点
double alpha = 0.7;
cv::Mat img_clone;
img.copyTo(img_clone);
cv::Point points_group[1][4];
const cv::Point* ppt[1] = { points_group[0] };
int npt[] = { 4 };
if (dx>grapT.width && dy>grapT.height*3)
{
// center the text
//TEXT-CLASS
class_point.x = xmin+ thickness * 8;
class_point.y = ymin + thickness * 9 + grapT.height;
putText(img, classname, class_point, 4, 1, color, thickness, lineType);///int fontFace:0-7,double fontScale:搭配前面的量一起使用*/
//TEXT-DEPTH
///标记距离
void Draw_Target(cv::Mat img, int xmin, int ymin, int xmax, int ymax, cv::Scalar &color, float depth, const char *classname, int thickness, int lineType)
{
char depth_buffer[10];
sprintf(depth_buffer, "%.2f m", depth);
int dx = xmax - xmin, dy = ymax - ymin;
int baselineT = 0;
cv::Size grapT = cv::getTextSize(classname, 4, 1, thickness, &baselineT);
int baseline = 0;
cv::Size grap = cv::getTextSize(depth_buffer, 4, 1, thickness, &baseline);
cv::Point class_point;///左底的点
cv::Point depth_point;///左底的点
double alpha = 0.7;
cv::Mat img_clone;
img.copyTo(img_clone);
cv::Point points_group[1][4];
const cv::Point* ppt[1] = { points_group[0] };
int npt[] = { 4 };
if (dx>grapT.width && dy>grapT.height*3)
{
// center the text
//TEXT-CLASS
class_point.x = xmin+ thickness * 8;
class_point.y = ymin + thickness * 9 + grapT.height;
putText(img, classname, class_point, 4, 1, color, thickness, lineType);///int fontFace:0-7,double fontScale:搭配前面的量一起使用*/
//TEXT-DEPTH
depth_point = class_point+ cv::Point(0, grap.height*2);
putText(img, depth_buffer, depth_point, 4, 1, color, thickness, lineType);///int fontFace:0-7,double fontScale:搭配前面的量一起使用
putText(img, depth_buffer, depth_point, 4, 1, color, thickness, lineType);///int fontFace:0-7,double fontScale:搭配前面的量一起使用
//draw box
points_group[0][0] = class_point + cv::Point(-thickness, -thickness*2 - grapT.height);
points_group[0][1] = class_point + cv::Point(grapT.width+ thickness, -thickness*2 - grapT.height);
points_group[0][2] = class_point + cv::Point(grapT.width+ thickness, thickness*2 + grap.height*2);
points_group[0][3] = class_point + cv::Point(-thickness, thickness*2 + grap.height*2);
fillPoly(img_clone, ppt, npt, 1, cv::Scalar(0,0,0), lineType);
//图片叠加
addWeighted(img, (double)alpha, img_clone, (double)(1 - alpha), 0, img);
}
else
{
// center the text
//TEXT-CLASS
class_point.x = xmin -thickness*2;
class_point.y = ymin - thickness * 6 - grapT.height*2;
putText(img, classname, class_point, 4, 1, color, thickness, lineType);///int fontFace:0-7,double fontScale:搭配前面的量一起使用*/
//TEXT-DEPTH
depth_point = class_point + cv::Point(0, grap.height*2 );
putText(img, depth_buffer, depth_point, 4, 1, color, thickness, lineType);///int fontFace:0-7,double fontScale:搭配前面的量一起使用
putText(img, depth_buffer, depth_point, 4, 1, color, thickness, lineType);///int fontFace:0-7,double fontScale:搭配前面的量一起使用
//draw box
points_group[0][0] = class_point + cv::Point(0, -thickness * 2 - grapT.height);
points_group[0][1] = class_point + cv::Point(grapT.width , -thickness * 2 - grapT.height);
points_group[0][2] = class_point + cv::Point(grapT.width , thickness * 2+ grap.height*2 );
points_group[0][3] = class_point + cv::Point(0, thickness * 2+ grap.height*2 );
points_group[0][1] = class_point + cv::Point(grapT.width , -thickness * 2 - grapT.height);
points_group[0][2] = class_point + cv::Point(grapT.width , thickness * 2+ grap.height*2 );
points_group[0][3] = class_point + cv::Point(0, thickness * 2+ grap.height*2 );
fillPoly(img_clone, ppt, npt, 1, cv::Scalar(0, 0, 0), lineType);
//图片叠加
addWeighted(img, (double)alpha, img_clone, (double)(1 - alpha), 0, img);
}
}
//图片叠加
addWeighted(img, (double)alpha, img_clone, (double)(1 - alpha), 0, img);
}
}
///显示框
void Draw_bounding_box(cv::Mat img, cv::Point min, cv::Point max, const char *classname, float depth, cv::Scalar &color)
{
int thickness_Four = 4, thickness_Two = 2, thickness_One = 1;
int lineType = 8;
int interspace = thickness_One * 8;
int interspace_C = thickness_One * 6;
int interspace_R = thickness_One * 5;
///design a beautiful bounding-box
int length = ((max.y - min.y) > (max.x - min.x) ? (max.x - min.x) / 10 : (max.y - min.y) / 10);
///矩形
Draw_Rectangle(img, min.x, min.y, max.x, max.y, color, thickness_Four, lineType);
///外边框
Draw_Rectangle(img, min.x - interspace_R, min.y - interspace_R, max.x + interspace_R, max.y + interspace_R, color, thickness_One, lineType);
///角标
Draw_Corner(img, min.x, min.y, max.x, max.y, color, interspace, length);
///十字星
Draw_Cross(img, min.x, min.y, max.x, max.y, color, interspace_C);
///标签填充多边形+文本
Draw_Target(img, min.x, min.y, max.x, max.y, color, depth,classname,thickness_Two, lineType);
}
void Draw_bounding_box(cv::Mat img, cv::Point min, cv::Point max, const char *classname, float depth, cv::Scalar &color)
{
int thickness_Four = 4, thickness_Two = 2, thickness_One = 1;
int lineType = 8;
int interspace = thickness_One * 8;
int interspace_C = thickness_One * 6;
int interspace_R = thickness_One * 5;
///design a beautiful bounding-box
int length = ((max.y - min.y) > (max.x - min.x) ? (max.x - min.x) / 10 : (max.y - min.y) / 10);
///矩形
Draw_Rectangle(img, min.x, min.y, max.x, max.y, color, thickness_Four, lineType);
///外边框
Draw_Rectangle(img, min.x - interspace_R, min.y - interspace_R, max.x + interspace_R, max.y + interspace_R, color, thickness_One, lineType);
///角标
Draw_Corner(img, min.x, min.y, max.x, max.y, color, interspace, length);
///十字星
Draw_Cross(img, min.x, min.y, max.x, max.y, color, interspace_C);
///标签填充多边形+文本
Draw_Target(img, min.x, min.y, max.x, max.y, color, depth,classname,thickness_Two, lineType);
}
int main(int argc, char *argv[])
{
{
cv::Mat left01;
left01 = cv::imread("timg.jpg");
/*
///功能:生成显示框
///参数:图片,Point min,Point max,物品类名称,距离(单位m),显示框颜色
*/
//sample-one
Draw_bounding_box(left01, cv::Point(950,250), cv::Point(1590, 800), "chessbox", 2.5234, cv::Scalar(255, 0, 0));
//sample-two
Draw_bounding_box(left01, cv::Point(100, 100), cv::Point(300, 300), "unknown", 1.542, cv::Scalar(0, 0, 192));
imshow("test", left01);
cv::waitKey(0);
return 0;
}
left01 = cv::imread("timg.jpg");
/*
///功能:生成显示框
///参数:图片,Point min,Point max,物品类名称,距离(单位m),显示框颜色
*/
//sample-one
Draw_bounding_box(left01, cv::Point(950,250), cv::Point(1590, 800), "chessbox", 2.5234, cv::Scalar(255, 0, 0));
//sample-two
Draw_bounding_box(left01, cv::Point(100, 100), cv::Point(300, 300), "unknown", 1.542, cv::Scalar(0, 0, 192));
imshow("test", left01);
cv::waitKey(0);
return 0;
}
显示效果如下: