Перейти к содержимому
Compvision.ru

Recommended Posts

Здравствуйте!
такой вопрос: создал прилагу по поиску фрагмента на картинке по шаблону

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#define  CV_TM_SQDIFF        0
 
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\opencv.hpp>
#include<opencv\cv.h>
#include<stdio.h>
 
using namespace cv;
using namespace std;
 
double minval, maxval;
 
int main(int argc, const char** argv)
{
    setlocale(LC_ALL, "Russian");
 
    string ishod_im = "TEST.jpg";
    char ish_is[100];
    strcpy(ish_is, ishod_im.c_str());
    IplImage* image = 0;
    image = cvLoadImage(ish_is, 1);
 
    string shablon_im = "X.jpg";
    char ish_sh[100];
    strcpy(ish_sh, shablon_im.c_str());
    IplImage* templ = 0;
    templ = cvLoadImage(ish_sh, 1);
    
    int width = templ->width;
    int height = templ->height;
    IplImage *res = cvCreateImage(cvSize((image->width - templ->width + 1), (image->height - templ->height + 1)), IPL_DEPTH_32F, 1);
    cvMatchTemplate(image, templ, res, CV_TM_SQDIFF);
    CvPoint minloc, maxloc;
    cvMinMaxLoc(res, &minval, &maxval, &minloc, &maxloc, 0);
    cvRectangle(image, cvPoint(minloc.x, minloc.y), cvPoint(minloc.x + templ->width - 1, minloc.y + templ->height - 1), CV_RGB(0, 0, 255), 2, 8);
    cvShowImage("Совпадения", image);
    waitKey(0);
    return 0;
}

С большего все работает норм, интересует два вопроса:
1. как сделать так чтобы находило более одного совпадения? (вроде как есть какой-то способ "скользящего окна", но хотелось бы знать как его реализовать. а может и не им надо пользоваться)
2. как сделать чтобы в случае отсутствия совпадения не показывал ни одной рамки (сейчас прога ищет совпадения, но даже если адекватных нет выдает хоть какой-то результат (неверный))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Вместо
cvMinMaxLoc(res, &minval, &maxval, &minloc, &maxloc, 0);

пробегайте сами по "res" и выбирайте максимальные значения с нужным фильтром. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С помощью этого решается 1-й или 2-й вопрос?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может есть какой нибудь пример или ссылка? не уверен что с моим опытом удастся правильно реализовать...(  Или хотя бы отправьте куда надо

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 31.03.2017 at 19:53, iskees сказал:

Вместо

cvMinMaxLoc(res, &minval, &maxval, &minloc, &maxloc, 0);

пробегайте сами по "res" и выбирайте максимальные значения с нужным фильтром. 

можно подробнее про "пробегайте"?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Отправляю: http://docs.opencv.org/2.4/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html

У ас MathTemplate выдаст изображение с типом элементов float если мне не изменяет склероз.

http://docs.opencv.org/trunk/d4/dc6/tutorial_py_template_matching.html см. картинки слева. И снизу, кстати есть пример поиска монеток на экране (на питоне, но смысл тот-же). 

Просканировали его и выбрали максимумы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нашел по вашим ссылкам нужный код, но не получается перевести его на С++ :unsure:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',0)
w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну же, неужели никто не поможет новичку?:(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

12 строчек ! 

За 6 дней можно не то что разобрать пример, но и питон выучить, если есть желание, а если нет, тогда привет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

так мне ж не все непонятно, затуп конкретно буквально в нескольких строках:

import cv2
import numpy as np  //что за numpy?
from matplotlib import pyplot as plt // as plt?

//дальше понятное дело считывание, перевод в грей, изменение размера

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) // тоже всё ясно
threshold = 0.8 // визуал предлагает либо cvThreshold либо threshold
loc = np.where( res >= threshold) //конструкция с перебором массива я так понимаю... как ее изобразить на ++
for pt in zip(*loc[::-1]): // откуда взялся zip
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) //рисуем квадрат

п.с. я же не все 6 дней сидел и думал над этим)) просто вспомнил на днях))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
import cv2 oprncv-шная либа
import numpy as np  //что за numpy? библиотека работы с матрицами, в питоне нет cv::Mat, там их заменяют матрицы numpy.
from matplotlib import pyplot as pl    библиотека для отрисовки графиков и изображений.

Это питоновские "#include" для С++ хватит и "#include opencv2/opencv.hpp" остальное в питоне и в C++ вариантах очень похоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×