picamera.camera Module provide function to apply various image effect. This example modified from previous post "Python to capture image from Pi Camera Module, with White Balance setting", to add feature to apply image effect.
reference: API - picamera.camera Module - image_effect
myPiCam.py
import picamera
import Tkinter as tk
import ttk
import time
from PIL import ImageTk, Image
from threading import Thread
import io
import sys
from pkg_resources import require
RQS_0=0
RQS_QUIT=1
RQS_CAPTURE=2
rqs=RQS_0
rqsUpdateSetting=True
def camHandler():
global rqs
rqs = RQS_0
camera = picamera.PiCamera()
#stream = io.BytesIO()
#set default
camera.sharpness = 0
camera.contrast = 0
camera.brightness = 50
camera.saturation = 0
camera.ISO = 0
camera.video_stabilization = False
camera.exposure_compensation = 0
camera.exposure_mode = 'auto'
camera.meter_mode = 'average'
camera.awb_mode = 'auto'
camera.image_effect = 'none'
camera.color_effects = None
#camera.rotation = 0
camera.rotation = 270
camera.hflip = False
camera.vflip = False
camera.crop = (0.0, 0.0, 1.0, 1.0)
#camera.resolution = (1024, 768)
camera.resolution = (400, 300)
#end of set default
#camera.start_preview()
while rqs != RQS_QUIT:
#check if need update setting
global rqsUpdateSetting
if rqsUpdateSetting == True:
rqsUpdateSetting = False
camera.sharpness = scaleSharpness.get()
camera.contrast = scaleContrast.get()
camera.brightness = scaleBrightness.get()
camera.saturation = scaleSaturation.get()
camera.exposure_compensation = scaleExpCompensation.get()
awb_mode_setting = varAwbMode.get()
labelAwbVar.set(awb_mode_setting)
camera.awb_mode = awb_mode_setting
if awb_mode_setting == "off":
gr = scaleGainRed.get()
gb = scaleGainBlue.get()
gAwb = (gr, gb)
camera.awb_gains = gAwb
labelAwbVar.set(awb_mode_setting + " : "
+ str(gAwb))
image_effect_setting = varImageEffect.get()
labelImageEffectVar.set(image_effect_setting)
camera.image_effect = image_effect_setting
if image_effect_setting == 'solarize':
if cbSolarize_yuv_Var.get():
yuv = 1
else:
yuv = 0
solarize_para = (
yuv,
scSolarize_x0_Var.get(),
scSolarize_y0_Var.get(),
scSolarize_y1_Var.get(),
scSolarize_y2_Var.get())
labelImageEffectVar.set(image_effect_setting + " " + str(solarize_para))
camera.image_effect_params = solarize_para
elif image_effect_setting == 'colorpoint':
camera.image_effect_params = quadrantVar.get()
labelImageEffectVar.set(image_effect_setting + " " + str(quadrantVar.get()))
elif image_effect_setting == 'colorbalance':
colorbalance_para = (
scColorbalance_lens_Var.get(),
scColorbalance_r_Var.get(),
scColorbalance_g_Var.get(),
scColorbalance_b_Var.get(),
scColorbalance_u_Var.get(),
scColorbalance_v_Var.get())
labelImageEffectVar.set(image_effect_setting + " " + str(colorbalance_para))
camera.image_effect_params = colorbalance_para
elif image_effect_setting == 'colorswap':
labelImageEffectVar.set(image_effect_setting + " " + str(cbColorswap_dir_Var.get()))
camera.image_effect_params = cbColorswap_dir_Var.get()
elif image_effect_setting == 'posterise':
labelImageEffectVar.set(image_effect_setting + " " + str(scPosterise_steps_Var.get()))
camera.image_effect_params = scPosterise_steps_Var.get()
elif image_effect_setting == 'blur':
labelImageEffectVar.set(image_effect_setting + " " + str(scBlur_size_Var.get()))
camera.image_effect_params = scBlur_size_Var.get()
elif image_effect_setting == 'film':
film_para = (
scFilm_strength_Var.get(),
scFilm_u_Var.get(),
scFilm_v_Var.get())
labelImageEffectVar.set(image_effect_setting + " " + str(film_para))
camera.image_effect_params = film_para
elif image_effect_setting == 'watercolor':
if cbWatercolor_uv_Var.get():
watercolor_para = (
scWatercolor_u_Var.get(),
scWatercolor_v_Var.get())
labelImageEffectVar.set(image_effect_setting + " " + str(watercolor_para))
camera.image_effect_params = watercolor_para
else:
watercolor_para = ()
labelImageEffectVar.set(image_effect_setting + " " + str(watercolor_para))
camera.image_effect_params = watercolor_para
if rqs == RQS_CAPTURE:
print("Capture")
rqs=RQS_0
timeStamp = time.strftime("%Y%m%d-%H%M%S")
jpgFile='img_'+timeStamp+'.jpg'
camera.resolution = (2592, 1944) #set photo size
camera.capture(jpgFile)
camera.resolution = (400, 300) #resume preview size
labelCapVal.set(jpgFile)
else:
stream = io.BytesIO()
camera.capture(stream, format='jpeg')
stream.seek(0)
tmpImage = Image.open(stream)
tmpImg = ImageTk.PhotoImage(tmpImage)
previewPanel.configure(image = tmpImg)
#sleep(0.5)
print("Quit")
#camera.stop_preview()
def startCamHandler():
camThread = Thread(target=camHandler)
camThread.start()
def quit():
global rqs
rqs=RQS_QUIT
global tkTop
tkTop.destroy()
def capture():
global rqs
rqs = RQS_CAPTURE
labelCapVal.set("capturing")
def cbScaleSetting(new_value):
global rqsUpdateSetting
rqsUpdateSetting = True
def cbButtons():
global rqsUpdateSetting
rqsUpdateSetting = True
tkTop = tk.Tk()
tkTop.wm_title("helloraspberrypi.blogspot.com")
tkTop.geometry('1000x650')
previewWin = tk.Toplevel(tkTop)
previewWin.title('Preview')
previewWin.geometry('400x300')
previewPanel = tk.Label(previewWin)
previewPanel.pack(side = "bottom", fill = "both", expand = "yes")
#tkButtonQuit = tk.Button(tkTop, text="Quit", command=quit).pack()
tkButtonCapture = tk.Button(
tkTop, text="Capture", command=capture)
tkButtonCapture.pack()
SCALE_WIDTH = 980;
labelCapVal = tk.StringVar()
tk.Label(tkTop, textvariable=labelCapVal).pack()
notebook = ttk.Notebook(tkTop)
frame1 = ttk.Frame(notebook)
frame2 = ttk.Frame(notebook)
frame3 = ttk.Frame(notebook)
notebook.add(frame1, text='Setting')
notebook.add(frame2, text='White Balance')
notebook.add(frame3, text='Image Effect')
notebook.pack()
# Tab Setting
scaleSharpness = tk.Scale(
frame1,
from_=-100, to=100,
length=SCALE_WIDTH,
orient=tk.HORIZONTAL,
label="sharpness",
command=cbScaleSetting)
scaleSharpness.set(0)
scaleSharpness.pack(anchor=tk.CENTER)
scaleContrast = tk.Scale(
frame1,
from_=-100, to=100,
length=SCALE_WIDTH,
orient=tk.HORIZONTAL,
label="contrast",
command=cbScaleSetting)
scaleContrast.set(0)
scaleContrast.pack(anchor=tk.CENTER)
scaleBrightness = tk.Scale(
frame1,
from_=0, to=100,
length=SCALE_WIDTH,
orient=tk.HORIZONTAL,
label="brightness",
command=cbScaleSetting)
scaleBrightness.set(50)
scaleBrightness.pack(anchor=tk.CENTER)
scaleSaturation = tk.Scale(
frame1,
from_=-100, to=100,
length=SCALE_WIDTH,
orient=tk.HORIZONTAL,
label="saturation",
command=cbScaleSetting)
scaleSaturation.set(0)
scaleSaturation.pack(anchor=tk.CENTER)
scaleExpCompensation = tk.Scale(
frame1,
from_=-25, to=25,
length=SCALE_WIDTH,
orient=tk.HORIZONTAL,
label="exposure_compensation",
command=cbScaleSetting)
scaleExpCompensation.set(0)
scaleExpCompensation.pack(anchor=tk.CENTER)
# Tab White Balance
lfAwbMode = ttk.LabelFrame(frame2, text="awb_mode")
lfAwbMode.pack(fill="x")
lfAwbGains = ttk.LabelFrame(frame2, text="awb_gains")
lfAwbGains.pack(fill="x")
labelAwbVar = tk.StringVar()
tk.Label(lfAwbMode, textvariable=labelAwbVar).pack()
#--
AWB_MODES = [
("off", "off"),
("auto", "auto"),
("sunlight", "sunlight"),
("cloudy", "cloudy"),
("shade", "shade"),
("tungsten", "tungsten"),
("fluorescent", "fluorescent"),
("incandescent", "incandescent"),
("flash", "flash"),
("horizon", "horizon"),
]
varAwbMode = tk.StringVar()
varAwbMode.set("auto")
for text, awbmode in AWB_MODES:
awbModeBtns = tk.Radiobutton(
lfAwbMode,
text=text,
variable=varAwbMode,
value=awbmode,
command=cbButtons)
awbModeBtns.pack(anchor=tk.W)
#--
scaleGainRed = tk.Scale(
lfAwbGains,
from_=0.0, to=8.0,
resolution=0.1,
length=SCALE_WIDTH,
orient=tk.HORIZONTAL,
label="Red",
command=cbScaleSetting)
scaleGainRed.set(0.0)
scaleGainRed.pack(anchor=tk.CENTER)
scaleGainBlue = tk.Scale(
lfAwbGains,
from_=0.0, to=8.0,
resolution=0.1,
length=SCALE_WIDTH,
orient=tk.HORIZONTAL,
label="Blue",
command=cbScaleSetting)
scaleGainBlue.set(0.0)
scaleGainBlue.pack(anchor=tk.CENTER)
# Tab Image Effect
#For Image effects, ref:
#http://picamera.readthedocs.org/en/latest/api_camera.html?highlight=effect#picamera.camera.PiCamera.image_effect
labelImageEffectVar = tk.StringVar()
tk.Label(frame3, textvariable=labelImageEffectVar).pack()
#-- image_effect
varImageEffect = tk.StringVar()
varImageEffect.set('none')
lfNoParaOpts1 = ttk.Frame(frame3)
lfNoParaOpts1.pack(fill="x", expand="yes")
tk.Radiobutton(lfNoParaOpts1, variable=varImageEffect,
text='none',value='none',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts1, variable=varImageEffect,
text='negative',value='negative',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts1, variable=varImageEffect,
text='sketch',value='sketch',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts1, variable=varImageEffect,
text='denoise',value='denoise',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts1, variable=varImageEffect,
text='emboss',value='emboss',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts1, variable=varImageEffect,
text='oilpaint',value='oilpaint',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts1, variable=varImageEffect,
text='hatch',value='hatch',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts1, variable=varImageEffect,
text='gpen',value='gpen',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
lfNoParaOpts2 = ttk.Frame(frame3)
lfNoParaOpts2.pack(fill="x", expand="yes")
tk.Radiobutton(lfNoParaOpts2, variable=varImageEffect,
text='pastel',value='pastel',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts2, variable=varImageEffect,
text='saturation',value='saturation',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts2, variable=varImageEffect,
text='washedout',value='washedout',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts2, variable=varImageEffect,
text='cartoon',value='cartoon',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts2, variable=varImageEffect,
text='deinterlace1',value='deinterlace1',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfNoParaOpts2, variable=varImageEffect,
text='deinterlace2',value='deinterlace2',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
lfSolarize = ttk.LabelFrame(frame3, text="solarize")
lfSolarize.pack(fill="x", expand="yes")
tk.Radiobutton(lfSolarize, variable=varImageEffect,
text='solarize',value='solarize',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
cbSolarize_yuv_Var = tk.BooleanVar()
tk.Checkbutton(lfSolarize, text="yuv",
variable=cbSolarize_yuv_Var, command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
scSolarize_x0_Var = tk.IntVar()
scSolarize_x0_Var.set(128)
tk.Scale(lfSolarize, from_=0, to=255,
orient=tk.HORIZONTAL, length=200, label="x0",
variable=scSolarize_x0_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scSolarize_y0_Var = tk.IntVar()
scSolarize_y0_Var.set(128)
tk.Scale(lfSolarize, from_=0, to=255,
orient=tk.HORIZONTAL, length=200, label="y0",
variable=scSolarize_y0_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scSolarize_y1_Var = tk.IntVar()
scSolarize_y1_Var.set(128)
tk.Scale(lfSolarize, from_=0, to=255,
orient=tk.HORIZONTAL, length=200, label="y1",
variable=scSolarize_y1_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scSolarize_y2_Var = tk.IntVar()
scSolarize_y2_Var.set(0)
tk.Scale(lfSolarize, from_=0, to=255,
orient=tk.HORIZONTAL, length=200, label="y2",
variable=scSolarize_y2_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
lfwatercolor = ttk.LabelFrame(frame3, text="watercolor")
lfwatercolor.pack(fill="x", expand="yes")
tk.Radiobutton(lfwatercolor, variable=varImageEffect,
text='watercolor',value='watercolor',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
cbWatercolor_uv_Var = tk.BooleanVar()
cbWatercolor_uv_Var.set(False)
tk.Checkbutton(lfwatercolor, text="uv",
variable=cbWatercolor_uv_Var, command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
scWatercolor_u_Var = tk.IntVar()
scWatercolor_u_Var.set(0)
tk.Scale(lfwatercolor, from_=0, to=255,
orient=tk.HORIZONTAL, length=200, label="u",
variable=scWatercolor_u_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scWatercolor_v_Var = tk.IntVar()
scWatercolor_v_Var.set(0)
tk.Scale(lfwatercolor, from_=0, to=255,
orient=tk.HORIZONTAL, length=200, label="v",
variable=scWatercolor_v_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
lffilm = ttk.LabelFrame(frame3, text="film")
lffilm.pack(fill="x", expand="yes")
tk.Radiobutton(lffilm, variable=varImageEffect,
text='film',value='film',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
scFilm_strength_Var = tk.IntVar()
scFilm_strength_Var.set(0)
tk.Scale(lffilm, from_=0, to=255,
orient=tk.HORIZONTAL, length=200, label="strength",
variable=scFilm_strength_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scFilm_u_Var = tk.IntVar()
scFilm_u_Var.set(0)
tk.Scale(lffilm, from_=0, to=255,
orient=tk.HORIZONTAL, length=200, label="u",
variable=scFilm_u_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scFilm_v_Var = tk.IntVar()
scFilm_v_Var.set(0)
tk.Scale(lffilm, from_=0, to=255,
orient=tk.HORIZONTAL, length=200, label="v",
variable=scFilm_v_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
lfblur = ttk.LabelFrame(frame3, text="blur")
lfblur.pack(fill="x", expand="yes")
tk.Radiobutton(lfblur, variable=varImageEffect,
text='blur',value='blur',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
scBlur_size_Var = tk.IntVar()
scBlur_size_Var.set(1)
tk.Scale(lfblur, from_=1, to=2,
orient=tk.HORIZONTAL, length=100, label="size",
variable=scBlur_size_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
lfcolorswap = ttk.LabelFrame(frame3, text="colorswap")
lfcolorswap.pack(fill="x", expand="yes")
tk.Radiobutton(lfcolorswap, variable=varImageEffect,
text='colorswap',value='colorswap',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
cbColorswap_dir_Var = tk.BooleanVar()
cbColorswap_dir_Var.set(False)
tk.Checkbutton(lfcolorswap, text="dir - 0:RGB to BGR/1:RGB to BRG",
variable=cbColorswap_dir_Var, command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
lfposterise = ttk.LabelFrame(frame3, text="posterise")
lfposterise.pack(fill="x", expand="yes")
tk.Radiobutton(lfposterise, variable=varImageEffect,
text='posterise',value='posterise',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
scPosterise_steps_Var = tk.IntVar()
scPosterise_steps_Var.set(4)
tk.Scale(lfposterise, from_=2, to=32,
orient=tk.HORIZONTAL, length=200, label="steps",
variable=scPosterise_steps_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
lfcolorpoint = ttk.LabelFrame(frame3, text="colorpoint")
lfcolorpoint.pack(fill="x", expand="yes")
tk.Radiobutton(lfcolorpoint, variable=varImageEffect,
text='colorpoint',value='colorpoint',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
quadrantVar = tk.IntVar()
quadrantVar.set(0)
tk.Radiobutton(lfcolorpoint, text="green",
variable=quadrantVar, value=0, command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfcolorpoint, text="red/yellow",
variable=quadrantVar, value=1, command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfcolorpoint, text="blue",
variable=quadrantVar, value=2, command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
tk.Radiobutton(lfcolorpoint, text="purple",
variable=quadrantVar, value=3, command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
lfcolorbalance = ttk.LabelFrame(frame3, text="colorbalance: I can't see the effect!")
lfcolorbalance.pack(fill="x", expand="yes")
tk.Radiobutton(lfcolorbalance, variable=varImageEffect,
text='colorbalance',value='colorbalance',command=cbButtons).pack(anchor=tk.W, side=tk.LEFT)
scColorbalance_lens_Var = tk.DoubleVar()
scColorbalance_lens_Var.set(0)
tk.Scale(lfcolorbalance, from_=0, to=256,
orient=tk.HORIZONTAL, length=140, label="lens",
variable=scColorbalance_lens_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scColorbalance_r_Var = tk.DoubleVar()
scColorbalance_r_Var.set(1)
tk.Scale(lfcolorbalance, from_=0, to=256,
orient=tk.HORIZONTAL, length=140, label="r",
variable=scColorbalance_r_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scColorbalance_g_Var = tk.DoubleVar()
scColorbalance_g_Var.set(1)
tk.Scale(lfcolorbalance, from_=0, to=256,
orient=tk.HORIZONTAL, length=140, label="g",
variable=scColorbalance_g_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scColorbalance_b_Var = tk.DoubleVar()
scColorbalance_b_Var.set(1)
tk.Scale(lfcolorbalance, from_=0, to=256,
orient=tk.HORIZONTAL, length=140, label="b",
variable=scColorbalance_b_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scColorbalance_u_Var = tk.IntVar()
scColorbalance_u_Var.set(0)
tk.Scale(lfcolorbalance, from_=0, to=255,
orient=tk.HORIZONTAL, length=140, label="u",
variable=scColorbalance_u_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
scColorbalance_v_Var = tk.IntVar()
scColorbalance_v_Var.set(0)
tk.Scale(lfcolorbalance, from_=0, to=255,
orient=tk.HORIZONTAL, length=140, label="v",
variable=scColorbalance_v_Var, command=cbScaleSetting).pack(anchor=tk.W, side=tk.LEFT)
#=======================================
print("start")
startCamHandler()
tk.mainloop()
updated@2016-04-15:
Current Raspbian Jessie come with PIL installed by default, but no ImageTk. If you run Python script reported with error:
ImportError: cannot import name ImageTk
Install python-imaging-tk
$ sudo apt-get install python-imaging-tk
Updated@2021-03-09:
No comments:
Post a Comment