Note
Go to the end to download the full example code.
12.1.10.2.1. Cross correlation of images#
In this demo the cross-correlation is calculated between two images acquired via the integrated webcam of your PC.
Can not open camera with OpenCVGrabber. Probabel root cause: WebCam is not available.
Used Itom Dummy Grabber instead.
from itom import dataIO
from itom import dataObject
from itom import ui
import numpy as np
from numpy import fft
# some methods
def acquireImage1():
g = cam.getAutoGrabbing()
cam.setAutoGrabbing(False)
cam.acquire()
cam.copyVal(image1)
gui.plot1["source"] = image1
cam.setAutoGrabbing(g)
def acquireImage2():
g = cam.getAutoGrabbing()
cam.setAutoGrabbing(False)
cam.acquire()
cam.copyVal(image2)
gui.plot2["source"] = image2
cam.setAutoGrabbing(g)
def evaluate():
"""determines the offset between image1 and image2
using cross-correlation and returns a tuple containing
the shift in x and y-direction"""
npImg1 = np.array(image1)
npImg2 = np.array(image2)
npImg1FFT = fft.fft2(npImg1)
npImg2FFT = fft.fft2(npImg2)
ccr = fft.ifft2(npImg1FFT * npImg2FFT.conj())
ccr_abs = np.abs(ccr) # np.ascontiguousarray(np.abs(ccr))
[m, n] = ccr_abs.shape
max_pos = np.argmax(ccr_abs)
offset_x = max_pos % n
offset_y = (max_pos - offset_x) / n
if offset_x > n / 2:
offset_x = offset_x - n
if offset_y > m / 2:
offset_y = offset_y - m
gui.lbl_dx["text"] = "dx: " + str(offset_x)
gui.lbl_dy["text"] = "dy: " + str(offset_y)
def saveImages():
filename = ui.getSaveFileName("Filename", filters="IDC (*.idc)", parent=gui)
if filename:
saveIDC(filename, {"image1": image1, "image2": image2})
def loadImages():
global image1
global image2
filename = ui.getOpenFileName("Filename", filters="IDC (*idc)", parent=gui)
if filename:
d = loadIDC(filename)
image1 = d["image1"]
image2 = d["image2"]
gui.plot1["source"] = image1
gui.plot2["source"] = image2
# open camera (make it before you start this script)
try:
cam = dataIO("OpenCVGrabber", colorMode="gray")
except:
print("Can not open camera with OpenCVGrabber. Probabel root cause: WebCam is not available.")
print("Used Itom Dummy Grabber instead.")
cam = dataIO("DummyGrabber")
# start camera
cam.startDevice()
# create data objects
image1 = dataObject()
image2 = dataObject()
# create gui
gui = ui("dialog.ui", ui.TYPEWINDOW)
gui.btnAcquire1.connect("clicked()", acquireImage1)
gui.btnAcquire2.connect("clicked()", acquireImage2)
gui.btnLoad.connect("clicked()", loadImages)
gui.btnSave.connect("clicked()", saveImages)
gui.btnEval.connect("clicked()", evaluate)
# show live image in upper plot
if cam.name() != "FileGrabber":
cam.setAutoGrabbing(True)
else:
cam.setAutoGrabbing(False)
gui.plotLive["camera"] = cam
gui.plotLive["keepAspectRatio"] = True
gui.plotLive["yAxisFlipped"] = True
gui.show()
Total running time of the script: (0 minutes 0.484 seconds)