linux 图片标记,利用OpenCV给图像添加标注

利用OpenCV给图像添加标注

本程序使用范围:为运动目标跟踪提供ground truth【真实数据】,然后你可以进行各种跟踪算法误差对比

这是写论文的好帮手哦!

代码如下:

// pic_label.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include

#include

#include

#include

using namespace std;

//全局变量

bool is_drawing=false;

vector biaozhu_boxs;

CvRect drawing_box;

IplImage *img,*img1;

static void help();

static void onMouse( int event, int x, int y, int, void* );

int _tmain(int argc, _TCHAR* argv[])

{

CvFont font;

CvScalar scalar;

char text[10];

// 初始化字体

double hScale=1;

double vScale=1;

int lineWidth=3;// 相当于写字的线条

scalar=CV_RGB(255,0,0);

cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);//初始化字体,准备写到图片上的

int frame_counter = 0;

int obj_id = 0;

CvCapture *capture=cvCreateFileCapture("a.avi");

img = cvQueryFrame(capture);

img1 = cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,3);

cvCopy(img,img1);

ofstream outfile("a.txt");

help();

for(vector::iterator it=biaozhu_boxs.begin();it!=biaozhu_boxs.end();++it)

{

cvRectangle(img1,cvPoint((*it).x,(*it).y),cvPoint((*it).x + (*it).width,(*it).y + (*it).height),CV_RGB(0,255,0));

}

cvShowImage("video",img);

cvSetMouseCallback( "video", onMouse, 0 );

while (1)

{

int c=cvWaitKey(0);

if( (c & 255) == 27 )

{

cout << "Exiting ...\n";

break;

}

switch((char)c)

{

case 'n':

//read the next frame

++frame_counter;

img = cvQueryFrame(capture);

cvCopy(img,img1);

if(!img){

cout<

return 0;

}

//save all of the labeling rects

for(vector::iterator it=biaozhu_boxs.begin();it!=biaozhu_boxs.end();++it)

{

cvRectangle(img1,cvPoint((*it).x,(*it).y),cvPoint((*it).x + (*it).width,(*it).y + (*it).height),CV_RGB(0,255,0));

itoa(obj_id,text,10);

cvPutText(img1,text,cvPoint((*it).x,(*it).y),&font,CV_RGB(255,255,255));//在图片中输出字符

outfile<

<

<

obj_id++;

}

obj_id = 0;

break;

case 'c':

//clear all the rects on the image

biaozhu_boxs.clear();

cvCopy(img,img1);

}

cvShowImage("video",img1);

}

cvNamedWindow("video",0);

cvReleaseCapture(&capture);

cvDestroyWindow("video");

return 0;

}

static void help()

{

cout << "This program designed for labeling video \n"

<

cout<

cout << "Hot keys: \n"

"\tESC - quit the program\n"

"\tn - next frame of the video\n"

"\tc - clear all the labels\n"

<

}

static void onMouse( int event, int x, int y, int, void* )

{

switch(event)

{

case CV_EVENT_LBUTTONDOWN:

//the left up point of the rect

is_drawing=true;

drawing_box.x=x;

drawing_box.y=y;

break;

case CV_EVENT_MOUSEMOVE:

//adjust the rect (use color blue for moving)

if(is_drawing){

drawing_box.width=x-drawing_box.x;

drawing_box.height=y-drawing_box.y;

cvCopy(img,img1);

for(vector::iterator it=biaozhu_boxs.begin();it!=biaozhu_boxs.end();++it)

{

cvRectangle(img1,cvPoint((*it).x,(*it).y),cvPoint((*it).x + (*it).width,(*it).y + (*it).height),CV_RGB(0,255,0));

}

cvRectangle(img1,cvPoint(drawing_box.x,drawing_box.y),cvPoint(drawing_box.x+drawing_box.width,drawing_box.y+drawing_box.height),CV_RGB(255,0,0));

}

break;

case CV_EVENT_LBUTTONUP:

//finish drawing the rect (use color green for finish)

if(is_drawing){

drawing_box.width=x-drawing_box.x;

drawing_box.height=y-drawing_box.y;

cvCopy(img,img1);

for(vector::iterator it=biaozhu_boxs.begin();

it!=biaozhu_boxs.end();++it){

cvRectangle(img1,cvPoint((*it).x,(*it).y),cvPoint((*it).x + (*it).width,(*it).y + (*it).height),CV_RGB(0,255,0));

}

cvRectangle(img1,cvPoint(drawing_box.x,drawing_box.y),cvPoint(drawing_box.x+drawing_box.width,drawing_box.y+drawing_box.height),CV_RGB(255,0,0));

biaozhu_boxs.push_back(drawing_box);

}

is_drawing=false;

break;

}

cvShowImage("video",img1);

return;

}

功能及用法:

1.鼠标框定目标【可多个】

2.按n,进入下一帧,保存当前框定目标坐标到txt文本【可多个】

3.按c,清除当前帧所有已标定区域【人总有犯错的时候】或者上一帧遗留的区域

文件保存格式:

帧编号目标编号矩形左上角坐标矩形右下角坐标

图片如下:

50fe5b77b923df0b7b4018e5cfeacbee.png

554e267118ce7bd4b9ab84b30d29545f.png

d83c65db059a22d1c37cd1c8382ec41f.png

接下来,就用Matlab尽情的画折线图吧!!吼吼!

--------------------------------------分割线 --------------------------------------

--------------------------------------分割线 --------------------------------------

OpenCV的详细介绍:请点这里

OpenCV的下载地址:请点这里

0b1331709591d260c1c78e86d0c51c18.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值