OpenCV小记(1)

整理了一下之前写的小例子,有几个还不错拿来分析一下。

例子一:画一个物体选框,标注类型以及相关参数。

///input:Point<xmin,ymin>,Point<xmax,ymax>,char * str(class),float depth,color
///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>

///矩形
 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];
  ///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 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 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 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);
 }
 ///十字星
 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);
 }
 ///标签:标记类别
 ///标记距离
 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:搭配前面的量一起使用
                     
  //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:搭配前面的量一起使用

                       //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 );
   fillPoly(img_clone, ppt, npt, 1, cv::Scalar(0, 0, 0), lineType);
   //图片叠加
   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);
 
 }
 
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;
}

显示效果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值