最近公司要做无人超市项目,基本实现方式是通过摄像头检测货柜里面有多少个什么类别的货品,也就是目标检测算法。该方法所需数据样本为标记了位置的货品图片,如下所示。
为了制作该图片,设计方法如下:
1、拍摄该样品360度的视频
2、将视频抓帧
3、将图片通过opencv拼装成样本

拍摄视频如下并抓帧的程序如下:


import os
import cv2
path = "F:/objectdect/avi/"

def openavifiletopic(filepath,index):
    cap = cv2.VideoCapture(filepath)
    if cap.isOpened():  # 判断是否正常打开
        rval, frame = cap.read()
    else:
        rval = False
    c = 0
    num = 0
    while rval:  # 循环读取视频帧
        rval, frame = cap.read()
        if (c % 10 == 0):
            filesavepath = path + str(index) + "/" + str(num) + ".jpg"
            cv2.imwrite(filesavepath, frame)  # 存储为图像
            num = num + 1
        c = c + 1
    cap.release()

for index in range (1,21):
    pathavi = path + str(index)
    rootdir = pathavi
    list = os.listdir(rootdir)  # 列出文件夹下所有的目录与文件
    for i in range(0, len(list)):
        filepath = os.path.join(rootdir, list[i])
        if os.path.isfile(filepath):
            print(list[i])
            filepath = pathavi + "/" + str(list[i])
            # 你想对文件的操作
            openavifiletopic(filepath,index)

生成样本的程序如下:
import random
import cv2
path = "F:/objectdect/all"
for index in range(0,10001):
    filepath = path + "/" + str(index) + ".jpg"
    #产生一个1到5的随机数
    numlist = [1,2,4]
    rndnum = random.sample(numlist, 1)[0]
    imglist = []
    for numindex in range(1,rndnum+1):
        #print(numindex)
        #随机取出一个文件夹中的一个图片
        classnum = random.randint(1, 20)
        jpgpath = "F:/objectdect/avi/" + str(classnum) + "/" + str(random.randint(0, 200))+".jpg"
        imgtemp = cv2.imread(jpgpath)
        imgtemp = cv2.resize(imgtemp, (500, 500), interpolation=cv2.INTER_CUBIC)
        imglist.append(imgtemp)
    try:
        print(rndnum)
        if rndnum == 1:
            imgall = cv2.hconcat(imglist)
            res = cv2.resize(imgall, (500, 500), interpolation=cv2.INTER_CUBIC)
            cv2.imwrite(filepath, res)  # 存储为图像
        if rndnum == 2:
            imgall = cv2.hconcat([imglist[0],imglist[1]])
            res = cv2.resize(imgall, (500, 500), interpolation=cv2.INTER_CUBIC)
            cv2.imwrite(filepath, res)  # 存储为图像
        if rndnum == 4:
            imgall1 = cv2.hconcat([imglist[0],imglist[1]])
            imgall2 = cv2.hconcat([imglist[2], imglist[3]])
            imgall = cv2.vconcat([imgall1, imgall2])
            res = cv2.resize(imgall, (500, 500), interpolation=cv2.INTER_CUBIC)
            cv2.imwrite(filepath, res)  # 存储为图像
    except:
        print("错误")

该程序保存了样本图片之后可以通过 voc数据集标记工具 生成对应的xml文件 即可开始目标检测算法的训练。
http://blog.csdn.net/hx921123/article/details/56484876