2015-10-02 2 views
1

Я пытаюсь определить игральные карты в изображениях. После того, как я успешно обнаружил ребра с помощью Canny (http://imgur.com/a/l4Kjd), я знаю, что я должен использовать обратное преобразование перспективы для отображения игровой карты для прямого просмотра, чтобы я мог использовать сопоставление шаблонов для идентификации карты. Является ли обнаружение углов жизнеспособным методом для разработки обратной перспективы одной или нескольких карт? И если да, то что было бы хорошим обнаружением угла -> комбинацией методов обратной технологии преобразования перспективы?Обратное картирование с угловым детектированием

Для записи я пытаюсь реализовать это в своем собственном коде, поскольку это связано с тем, что он сильно опирается на OpenCV, но любое руководство для достижения этой цели будет оценено по достоинству.

+0

IMHO вы можете определить все карты на основе анализа контуров без преобразования перспективы. если вы поделитесь своим кодом, чтобы получить заданный образ, я могу показать вам что-то, чтобы улучшить мою идею (я хочу, чтобы ваш код понял, могу ли я вам помочь, потому что моя идея зависит от использования OpenCV C++) – sturkmen

+0

Я могу поместить свой код в немного позже, но не стесняйтесь делиться своей идеей. Я могу успешно обнаружить края, но после этого я потерян. Какова будет ваша идея с использованием OpenCV? Даже если я просто опишу процесс с помощью функций OpenCV, я могу разработать свой собственный код позже. Я получу код, когда буду дома. Как вы подходите к нему со сцены, следующей за Canny? –

ответ

0

Это не очень жалкий ответ, просто чтобы показать свою идею, этот простой код помогает понять, как контуры можно фильтровать для легкого анализа.

Я думаю, что внедрение простого идентификатора (для карт без карты) возможно путем подсчета счетчиков, которые находятся внутри контура карты. (извините за мой бедный английский)

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int, char** argv) 
{ 
    Mat src,src_gray; 
    src = imread(argv[1]); 
    if (src.empty()) 
    { 
     cerr << "No image supplied ..." << endl; 
     return -1; 
    } 
    cvtColor(src, src_gray, COLOR_BGR2GRAY); 
    src_gray = src_gray <127; 

    // to simplicify contours 
    dilate(src_gray,src_gray,Mat(),Point(-1,-1),2); 
    erode(src_gray,src_gray,Mat(),Point(-1,-1),10); 

    vector<vector<Point> > contours; 
    vector<Vec4i> hierarchy; 
    vector<Point> approx; 

    findContours(src_gray, contours, RETR_LIST, CHAIN_APPROX_SIMPLE); 
    src = Scalar(255,255,255); 

    int counter = 0; 
    for(size_t i = 0; i< contours.size(); i++) 
    { 
     approxPolyDP(contours[i],approx,15,true); 

     Scalar color; 

     if(approx.size() == 4 & contourArea(approx) > 5000) 
      color = Scalar(0,0,255); 

     { 
      drawContours(src,contours,i,Scalar(0,255,0),1, LINE_AA, hierarchy, 1); 
      polylines(src,approx,true,color); 
      if(approx.size() == 3) counter++; 
     } 
    } 
    putText(src, format("%d",counter), Point(100, 100),FONT_HERSHEY_SIMPLEX, 2, Scalar(255,0,0), 4); 
    imshow("result", src); 

    waitKey(0); 
    return(0); 
} 

результат изображения:

enter image description here

enter image description here

EDIT: код обновляется

+0

Так есть способ обнаружить такие углы? И каким образом можно изолировать определенные карточки, например. если есть несколько карт, как я узнаю, какие контуры представляют, какие карты смотрят на векторы или какие контуры действительно представляют карты, а не разные символы? Вы фильтруете по размеру контуров? Спасибо за помощь! –

+0

Так есть способ обнаружить такие углы? как вы видите, красный прямоугольник рисуется с 4-мя угловыми точками. у черных цветных контуров есть информация о том, в каком контуре они находятся – sturkmen

+0

У меня он работает в моем собственном коде, но просто для уточнения ... ApproxPolyDP находит углы заданных контуров? Итак, найдите контуры, это имя, и тогда я думаю, что если вы проверяете 4 угла и больше определенного порога пикселей, то вы определили, что это карта? –

Смежные вопросы