利用python调用本地摄像头拍照,对图片命名并保存到指定位置,带界面

1.需求:

因项目需要做一个以图搜图的小程序,需要储备零件图库,约1000种

2.原计划&痛点

原本想通过手机挨个拍照,再拷贝出来,重命名,这样会耽误大量时间,且容易出错

3.解决方案

于是做了一个调用本地摄像头拍照的小程序,利用tkinter做了界面,拍照时即按照一定规则命名(部分前半段命名方式相同),放置在指定路径内

由于一个零件需要多个拍照,通过时间戳的方法避免了重名文件的覆盖问题

界面效果如下:

利用python调用本地摄像头拍照,对图片命名并保存到指定位置,带界面_第1张图片

 代码如下:

# -*- coding: utf-8 -*-

import cv2
import tkinter as tk
from tkinter import *
from tkinter.filedialog import askdirectory
import os
from PIL import Image, ImageTk
from datetime import datetime

cap = cv2.VideoCapture(0)   #打开摄像头

#摄像头画布内显示
def tkImage():
    ref,frame = cap.read()   # get a frame
    cvimage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    pilImage = Image.fromarray(cvimage)
    pilImage = pilImage.resize((600, 500),Image.ANTIALIAS)  #图像大小重置成和画布一样的
    tkImage = ImageTk.PhotoImage(image = pilImage)
    return tkImage
#拍照程序
def photo():
    ref,frame = cap.read()  # get a frame
    time_str = datetime.strftime(datetime.now(), '%Y-%m%d-%H-%M-%S')
    cv2.imwrite(path.get() + "\\" + entry_filename.get() + f"({time_str})" + ".png", frame)  #拍照保存到指定位置

def photo_short():
    ref,frame = cap.read()  # get a frame
    time_str = datetime.strftime(datetime.now(), '%Y-%m%d-%H-%M-%S')
    cv2.imwrite(path.get() + "\\" + "XXXX-0000000" + entry_filename_short.get() + f"({time_str})" + ".png", frame)  #拍照保存到指定位置

def selectPath():
    path_ = askdirectory() #使用askdirectory()方法返回文件夹的路径
    if path_ == "":
        path.get() #当打开文件路径选择框后点击"取消" 输入框会清空路径,所以使用get()方法再获取一次路径
    else:
        path_ = path_.replace("/", "\\")  # 实际在代码中执行的路径为“\“ 所以替换一下
        path.set(path_)

def openPath():
    dir = os.path.dirname(path.get()+"\\")
    os.system('start ' + dir)
    #print(dir)

#界面部分
top = tk.Tk()
top.title('视频窗口')
top.geometry('900x600')
path = StringVar()
path.set(os.path.abspath("."))

#摄像头部分
canvas = Canvas(top,bg = 'white',width = 600,height = 500 )
canvas.place(x = 50,y = 50)

#输入部分(标准)
entry_filename_short = Entry(top,font=("微软雅黑",10),fg="black",width = 7)
Label(top, text="XXXX-0000000").place(x = 660,y = 150)
entry_filename_short.place(x = 760,y = 150)
Button(top,text = "点此保存图片",command = photo_short,fg="black").place(x = 660,y = 180)

#输入部分(自定义)
entry_filename = Entry(top,font=("微软雅黑",10),fg="blue")
entry_filename.place(x = 660,y = 250)
Button(top,text = "点此保存图片",command = photo,fg="blue").place(x = 660,y = 280)

#浏览部分
Label(top, text="目标路径/工站位置:").grid(row=0, column=0)
Entry(top, textvariable=path, state="readonly").grid(row=0, column=1, ipadx=200)
# e.insert(0,os.path.abspath("."))
Button(top, text="路径选择", command=selectPath).grid(row=0, column=2)
Button(top, text="打开文件位置", command=openPath).grid(row=0, column=3)

while True:
  pic = tkImage()
  canvas.create_image(0,0,anchor = 'nw',image = pic)
  top.update()
  top.after(1)
cap.release()

非计算机科班出身,写的代码难免不够专业(追求能用就行hhh),还请各位大佬多多指正

你可能感兴趣的:(python,opencv,开发语言)