由于项目需要本人需要自己制作自己的数据集,所以写下。有些数据集可以从网上download下来,又或者从网页爬虫下来,但是自己动手制作自己的数据集又未尝不可,实用性更大。下面是一个简单的利用opencv调用摄像头来拍照收集图片的代码(每按键一次s键,拍照一次,当然你也可以搞个每隔几秒拍一次我就不想改代码了,嫌麻烦),主要特色是里面加了一个改变亮度和对比度的函数,可以增加数据的丰富度,增强在不同的光源下的识别效率(如果你做物体识别时):

import cv2
import os
import sys
import random

//当前目录下创建一个文件夹my_data
out_dir='./my_data'
if not os.path.exists(out_dir):
    os.makedirs(out_dir)

#改变亮度和对比度
def relight(img,alpha=1,bias=0):
    w, h = img.shape[:2]

    for i in range(0,w):
        for j in range(0,h):
            for c in range(3):
                tmp=int(img[i,j,c]*alpha+bias)
                if tmp>255:
                    tmp=255
                elif tmp<0:
                    tmp=0
                img[i,j,c]=tmp
    return img

cap = cv2.VideoCapture(1)
i = 1
while (1):
    ret, img = cap.read()
    k = cv2.waitKey(1)
    # 按下esc退出
    if k == 27:
        break
    elif k == ord('s'):
        # 改变图像的亮度,增加图像的对比性,可以识别不同光源下的
        img = relight(img, random.uniform(0.5, 1.5), random.randint(-50, 50))
        cv2.imwrite(out_dir + '/image'+ str(i) + '.jpg', img)  //image是你想要的图片名字喔,得到的是imagei.jpg
        print('It`s the %s image.' % str(i))
        i += 1
    cv2.imshow("capture", img)
cap.release()

当然,增加改变亮度和对比度使得在每拍一张图片的时候有点卡顿感,但是影响不大。如果你觉得用不到也可以删去。

如果想在拍照的时候顺便改下图片的像素怎么办呢?这个简单:
你可以在
cap = cv2.VideoCapture(1)
后面加上
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)

可不可行呢?本人没试过,应该是可以的。

更多推荐

python opencv 制作属于自己的数据集