热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用harrTraining进行电池的识别实验

http:blog.csdn.nethardVBarchive200710101818756.aspx请从opencv_share@163.com密码:download

http://blog.csdn.net/hardVB/archive/2007/10/10/1818756.aspx

请从opencv_share@163.com  密码:download 下载完整格式的文档与代码。

 

使用harrTraining进行电池的识别实验
by hardy
http://blog.csdn.net/hardvb
提取训练数据
在OpenCV_ObjectDetection_HowTo.pdf 提到的objectmaker.exe,实际中没有找到,只好
自己写了一个。
该小程序完成从摄像头中选定小图像的功能。
使用方法:
使用m按键切换模式
然后按键s 使画面暂停,
用鼠标点击移动选取检测物体的位置。
再按s按键存储数据。
数据提取模式分别为
• 创建正向训练数据,
• 创建背景图像
• 创建测试数据
其中正向训练数据在目录posdata/sample.txt下,格式为:
1100.bmp 3 20 80 21 58 142 69 18 58 255 94 22 74
1243.bmp 3 17 78 27 62 142 68 19 61 251 94 25 77
1470.bmp 3 16 88 32 72 137 83 23 74 273 100 28 79
背景图像为抓取图像,在目录negdata/sample.txt下,格式为:
01NFW-Large.bmp
01NFW-Small.bmp
02Block-Large.bmp
(这里的背景图像也可以从硬盘中文件中搜索的,大小可以与正向训练数据不同)
其中测试训练数据在目录testdata/sample.txt下,格式为:
1100.bmp 3 20 80 21 58 142 69 18 58 255 94 22 74
与正向训练数据一样。
新的objectmaker.exe 代码如下:
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
IplImage *image = 0,*image_show = 0, *grey = 0, *prev_grey = 0;
struct PicRECT
{
PicRECT(){count=0;IsDrawing= false;IsStop=false;mode= 0;}
CvRect *prect()
{
return &rect[count];
}
CvRect rect[100];
int count;
bool IsDrawing;
bool IsStop;
int mode;
};
PicRECT myPicRECT;
using namespace std;
long frame_count =0;
void on_mouse( int event, int x, int y, int flags, void* param )
{
if( !image )
return;
if( image->origin )
y = image->height - y;
if( event == CV_EVENT_LBUTTONDOWN )
{
//pt = cvPoint(x,y);
if(!myPicRECT.IsDrawing)
{
myPicRECT.prect()->x = x;
myPicRECT.prect()->y = y;
myPicRECT.IsDrawing = true;
}e
lse
{
myPicRECT.prect()->width = x-myPicRECT.prect()->x;
myPicRECT.prect()->height = abs(y- myPicRECT.prect()->y);
//myPicRECT.prect()->y = y;
myPicRECT.IsDrawing = false;
myPicRECT.count ++;
}
}
if(event == CV_EVENT_MOUSEMOVE)
{
if(myPicRECT.IsDrawing)
{
myPicRECT.prect()->width = x-myPicRECT.prect()->x;
myPicRECT.prect()->height = y- myPicRECT.prect()->y;
}
}
}
void saveData();
int main(int argc, char* argv[])
{
cvNamedWindow("win1",0);
cvSetMouseCallback( "win1", on_mouse, 0 );
CvCapture* capture = 0;
capture = cvCaptureFromCAM(0 );
if( !capture )
{
fprintf(stderr,"Could not initialize capturing.../n");
return -1;
}
for(;;)
{
IplImage* frame = 0;
frame = cvQueryFrame( capture );
if( !frame )
break;
if( !image )
{
/* allocate all the buffers */
image = cvCreateImage( cvGetSize(frame), 8, 3 );
image_show = cvCreateImage( cvGetSize(frame), 8, 3 );
image_show->origin=image->origin = 0;
grey = cvCreateImage( cvGetSize(frame), 8, 1 );
prev_grey = cvCreateImage( cvGetSize(frame), 8, 1 );
}i
f(!myPicRECT.IsStop) cvCopy( frame, image, 0 );
cvCopy( image, image_show, 0 );
cvCvtColor( image, grey, CV_BGR2GRAY );
for(int i=0;i{
CvPoint pt1,pt2;
pt1= cvPoint(myPicRECT.rect[i].x,myPicRECT.rect[i].y);
pt2= cvPoint(pt1.x + myPicRECT.rect[i].width, pt1.y +
myPicRECT.rect[i].height);
if(i==myPicRECT.count)
{
if(myPicRECT.IsDrawing )
cvRectangle(image_show,pt1,pt2,CV_RGB(0,255,0),1,8,0);
}e
lse
cvRectangle(image_show,pt1,pt2,CV_RGB(0,255,0),1,8,0);
}
cvShowImage("win1",image_show);
char c = cvWaitKey(10);
if( c == 27 ) break;
if( c == 's' )
{
if(myPicRECT.IsStop) saveData();
myPicRECT.IsStop = myPicRECT.IsStop^1;
}i
f(c=='m')
{
myPicRECT.mode = (myPicRECT.mode+1)%3;
if(myPicRECT.mode==0) cout<<"in InPositive mode "<else if(myPicRECT.mode==1) cout<<"in InNegativemode "<else if(myPicRECT.mode==2) cout<<"in InTestmode "<}
frame_count++;
}
cvReleaseCapture( &capture );
cvDestroyWindow("win1");
return 0;
}/
/save
void saveData()
{
if(myPicRECT.mode==1)
{
string fname("");
string fpath("negdata//");
char buf[10];
sprintf_s(buf,10,"%d",frame_count);
fname.append (buf);
fname.append (".bmp");
fpath = fpath.append(fname);
cvSaveImage(fpath.c_str(),image);
std::fstream datafile("negdata//sample.txt",std::ios::app);
datafile<datafile<datafile.close();
}i
f(myPicRECT.count>0 && myPicRECT.mode==2)
{
string fpath("testdata//");
string fname("");
char buf[10];
sprintf_s(buf,10,"%d",frame_count);
fname.append (buf);
fname.append (".bmp");
fpath = fpath.append(fname);
cvSaveImage(fpath.c_str(),image);
std::fstream datafile("testdata//sample.txt",std::ios::app);
datafile<datafile<<" "<for(int i=0;i{
datafile<<" "<datafile<<" "<datafile<<" "<datafile<<" "<}
datafile<datafile.close();
myPicRECT.count =0;
myPicRECT.IsDrawing = false;
}i
f(myPicRECT.count>0 && myPicRECT.mode==0)
{
string fpath("posdata//");
string fname("");
char buf[10];
sprintf_s(buf,10,"%d",frame_count);
fname.append (buf);
fname.append (".bmp");
fpath = fpath.append(fname);
cvSaveImage(fpath.c_str(),image);
std::fstream datafile("posdata//sample.txt",std::ios::app);
datafile<datafile<<" "<for(int i=0;i{
datafile<<" "<datafile<<" "<datafile<<" "<datafile<<" "<}
datafile<datafile.close();
myPicRECT.count =0;
myPicRECT.IsDrawing = false;
}
cout<<"Save OK!"<}
使用haartraining
步骤一,创建sample
"C:/Program Files/OpenCV/bin/createsamples.exe" -info "posdata/sample.txt" -vec
data/pos.vec -num 609 -w 20 -h 50
步骤二,haartraining
"C:/Program Files/OpenCV/bin/haartraining.exe" -data data/cascade -vec
data/pos.vec -bg negdata/sample.txt -npos 609 -nneg 918 -mem 1200 -mode ALL -w
20 -h 50
步骤三,测试
"C:/Program Files/OpenCV/bin/performance.exe" -data data/cascade -info
testdata/sample.txt -w 20 -h 50 -rs 18
检测结果:18个测试图例中3个无法找到,一个误检。


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 精选30本C# ASP.NET SQL中文PDF电子书合集
    欢迎订阅我们的技术博客,获取更多关于C#、ASP.NET和SQL的最新资讯和资源。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
author-avatar
优优绿园之时尚饰品_834
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有