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
VIDEO
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: