OpenCV 训练器样本创建辅助脚本

代码经过简单整理后已经放到 Github 上了, 地址:https://github.com/xiaoya/OpenCVSampleCreatorAux.git


脚本是用Python写的,需要 OpenCV 的 Python 支持;Win7 + OpenCV 2.3 和 fedora 15 + OpenCV 2.2 下测试通过。
使用:
1. 假设下面的代码被保存在 xxx.py 中。
2. 终端命令,直接以命令行参数指定文件名:

xxx.py 001.png 002.png

3.直接拉一个矩形(再次单击取消选择), s 添加选区到临时结果中(每次绘好一个选区后,按一下 s 保存,程序会在终端输出临时结果),r 清空 s 保存的所有结果, S 保存所有选区到文件中,Esc 退出。鼠标中键可以调整选区大小。
4.某很懒,代码里没放注释,还有一些地方没完善...... 保存文件名(abc.idx)直接写在代码里了......
5.效果图:


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import cv

box = [-1, -1, 0, 0]
drawing_box = 0

def draw_box(image, rect):
    cv.Rectangle(image, (rect[0], rect[1]), (rect[0] + rect[2], rect[1] + rect[3]), cv.Scalar(0xff, 0x00, 0x00))

def draw_rectangle_callback(event, x, y, flags, param):
    global drawing_box
    global box
    global flush
    if event == cv.CV_EVENT_MOUSEMOVE:
        if drawing_box:
            box[2] = x - box[0];
            box[3] = y - box[1];
    elif event == cv.CV_EVENT_LBUTTONDOWN:
        drawing_box = 1
        box = [x, y, 0, 0]
    elif event == cv.CV_EVENT_LBUTTONUP:
        drawing_box = 0
        if box[2] < 0:
            box[0] += box[2]
            box[2] *= -1
        if box[3] < 0:
            box[1] += box[3]
            box[3] *= -1
        draw_box(param, box)
    elif event == cv.CV_EVENT_MBUTTONDOWN:
        print box
        if box[0] > 0:
            box[2] = x - box[0]
            box[3] = y - box[1]
            if box[2] < 0:
                box[0] += box[2]
                box[2] *= -1
            if box[3] < 0:
                box[1] += box[3]
                box[3] *= -1
            draw_box(param, box)

if __name__ == '__main__':
    srcv = sys.argv[1:]
    size = len(srcv)
    f = open('abc.idx', 'a')
    for i in srcv:
        object_cnt = 0
        saving_msg = ''
        img = cv.LoadImageM(i)
        cv.NamedWindow(i)
        cv.ShowImage(i, img)
        src = cv.CreateImage(cv.GetSize(img), 8, 3)
        cv.Copy(img, src)
        temp = cv.CreateImage(cv.GetSize(img), 8, 3)
        cv.SetMouseCallback(i, draw_rectangle_callback, img)
        while 1:
            cv.Copy(img, temp)
            if drawing_box:
                draw_box(temp, box)
            cv.ShowImage(i, temp)
            cv.Copy(src, img)
            draw_box(img, box)
            cv.ShowImage(i, img)
            key = cv.WaitKey(15)
            if key == 115:
                if box[0] > 0:
                    object_cnt += 1
                    saving_msg += '    {0} {1} {2} {3}'.format(box[0], box[1], box[2], box[3])
                    print i + '    {0}'.format(object_cnt) + saving_msg
            elif key == 83:
                f.write(i + '    {0}'.format(object_cnt) + saving_msg + '\n')
                print 'Saving item "' + i + '    {0}'.format(object_cnt) + saving_msg + '"'
            elif key == 114:
                object_cnt = 0
                saving_msg = ''
            elif key == 27:
                box = [-1, -1, 0, 0]
                break
        cv.DestroyWindow(i)

 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个用于计算机视觉和机器学习的开源库,其中包含了许多功能强大的算法和工具。级联分类器是其中的一个重要功能,它可以用于目标检测和识别。 在训练级联分类器时,我们需要准备正样本。正样本是包含我们所关注目标的图像,比如人脸、车辆、文字等等。为了训练级联分类器,我们需要大量的正样本图像,这样才能让分类器具备更好的泛化能力。 训练级联分类器的过程可以分为以下几个步骤: 1. 收集正样本图像:我们可以通过各种方式来收集正样本图像,比如在网上下载、自己标注、从已有的数据集中提取等等。收集的正样本图像应该尽可能多样化,包含不同的姿势、光照条件、背景等等,以提高分类器的鲁棒性。 2. 创建样本描述文件:在训练级联分类器时,我们需要提供一个样本描述文件,用于描述每个样本图像的位置和标签。这个描述文件可以是一个XML文件,其中包含了每个样本图像的文件路径、位置和标签信息。 3. 训练级联分类器:在训练过程中,我们需要提供正样本图像和对应的样本描述文件,以及一些训练参数。通过迭代的方式,级联分类器会学习到目标的特征,并不断优化自身的分类能力。训练的过程通常需要较长的时间,特别是当样本数量较多时。 4. 评估和调优:在训练完成后,我们需要对训练得到的级联分类器进行评估。可以使用一部分已经标注好的测试图像来评估分类器的性能,计算准确率、召回率等指标。如果分类器的性能不理想,我们可以调整训练参数,或者增加更多的正样本进行训练,以提高分类器的性能。 通过以上步骤,我们可以利用OpenCV训练级联分类器,用于目标检测和识别任务。随着训练的迭代次数增加,分类器会逐渐提高自身的准确性和鲁棒性,从而更好地适应各种实际场景中的目标检测需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值