0

I have one image for example bussiness card like this

enter image description here

Than I have multiple images that this bussiness is inside there for example

enter image description here

or this one

enter image description here

I need to detect that bussiness card in those two tables and get position (x-y) of object and also width-height I researched about openCV but it's so complicated and I dont know how to set an input to recognize that object that I chosed in other image

G.L
  • 139
  • 1
  • 4
  • 16
  • 1
    Object detection is a complicated topic, and I doubt a general answer here will be more helpful to you than any of the tutorials available on the net. But if you could share what you have tried so far and where you are stuck, perhaps we can help you further. For best results, limit your question to one concrete problem, ideally with some code example that you are struggling with. – HugoRune Sep 21 '17 at 09:05

1 Answers1

3

it is called Template Matching. Here is the python code taken from :

https://docs.opencv.org/4.x/d4/dc6/tutorial_py_template_matching.html

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('yourcard.jpg',0)
img2 = img.copy()
template = cv.imread('template.jpg',0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR',
            'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']
for meth in methods:
    img = img2.copy()
    method = eval(meth)
    # Apply template Matching
    res = cv.matchTemplate(img,template,method)
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
    # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
    if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv.rectangle(img,top_left, bottom_right, 255, 2)
    plt.subplot(121),plt.imshow(res,cmap = 'gray')
    plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
    plt.subplot(122),plt.imshow(img,cmap = 'gray')
    plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()

This is the result:

enter image description here

embeddedstack
  • 362
  • 1
  • 13
  • WOoooW thanks so much : ) if u have something for java it would be great anyway thanks u give me big hint – G.L Sep 21 '17 at 09:42
  • You find here java examples http://docs.opencv.org/trunk/de/da9/tutorial_template_matching.html – embeddedstack Sep 21 '17 at 09:56
  • @G.L if the solution posted answered your question, be sure to mark it as accepted. Otherwise if you have questions for the answerer before doing so, ask them. Also, you might come across the issue where the template image (business card) is different sizes inside the image. A naive approach by just resizing the image until the best possible match is found can work pretty well; [this is a good tutorial](http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/) for implementing that. – alkasm Sep 22 '17 at 12:50
  • Your links are dead. This is why it is strongly encouraged to include the relevant source code directly into the question or answer. – ryyker Nov 04 '22 at 12:12
  • Thanks for responding, but it is [still just a linked answer](https://meta.stackexchange.com/q/8231/236796). Is there a reason that you cannot also take the time to include a short excerpt of the relevant code from the linked source directly into the answer? (It would make your answer impervious to disappearing content due to a stale link.) – ryyker Nov 04 '22 at 12:24