We have one original image / photo of the item. (ie sculpture).
Time to time we are taking new photos of the item. Photo always taken same angle 90 degree to the item. but
Also lighting changes so colour and lightning also not same always. Time to time there will be a mud, different small objects on the item.
I would love to your suggestions and solutions to detect and mark the different part of the object on the new picture with opencv.
We tried resemblejs but it shows all parts changed due to colour, length etc differences. But object is same
Thx
code :
from skimage.measure import compare_ssim
import argparse
import imutils
import cv2
import numpy as np
ap = argparse.ArgumentParser()
ap.add_argument("-f", "--first", required=True,
help="first input image")
ap.add_argument("-s", "--second", required=True,
help="second")
args = vars(ap.parse_args())
imageA = cv2.imread(args["first"])
imageB = cv2.imread(args["second"])
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
(score, diff) = compare_ssim(grayA, grayB, full=True)
diff = (diff * 55).astype("uint8")
print("SSIM: {}".format(score))
thresh = cv2.threshold(diff, 0, 255,
cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
for c in cnts:
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow("Diff", diff)
cv2.waitKey(0)
Edit 1
Link to test images
A couple methods come to mind.
Calculate the difference between frames. OpenCV offers absdiff
for doing just that. From there findContours
of the resulting difference matrix then draw
them.
This tutorial uses scikit-image for image differences
You could also look into meanStdDev
to accomplish this. Calculate the standard deviation of two frames and check to see if it passes a certain threshold.