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

来源:互联网 发布:linux移植后有密码 编辑:程序博客网 时间:2024/05/17 06:02

代码经过简单整理后已经放到 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 sysimport osimport cvbox = [-1, -1, 0, 0]drawing_box = 0def 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)

	
				
		
原创粉丝点击