ближайший контур к прямоугольнику - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь обнаружить и извлечь игральные карты из изображения.План состоит в том, чтобы обнаружить контуры карточек и затем извлечь их, используя область контуров.(Есть ли более эффективный способ сделать это?) Проблема в том, что у меня были проблемы с незамкнутыми контурами: enter image description here

С этими контурами я не могурассчитать площадь прямоугольников.Следовательно, я выполнил морфологические преобразования, чтобы закрыть контуры, получив следующее: enter image description here

И после извлечения ребер: enter image description here

Выходменя с этими "прямоугольниками" с закрученными углами по краям.Как я могу приблизить эти псевдо-прямоугольники к идеальным геометрическим прямоугольникам?

Есть ли более эффективный способ сделать это?

Вот мой код:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;
using namespace std;

#define BKG_THRESH 60 // preProcessImg

Mat src;


void preProcessImg(Mat* _img){
    Mat aux_gray;

    cvtColor(*_img, aux_gray, CV_BGR2GRAY );

    GaussianBlur(aux_gray, *_img, Size(5,5), 0);
}



int main( int argc, char** argv ){
    vector<vector<Point>> contours;


    /// Load an image
    src = imread("img.jpg");

    preProcessImg(&src);

    Canny(src, src, 30, 200);

    //Mostrar imagem
    namedWindow( "canny_output", CV_WINDOW_NORMAL); // Create a window
    imshow( "canny_output", src);
    waitKey(0);

    Mat structuringElement = getStructuringElement(MORPH_ELLIPSE, Size(7, 7));
    morphologyEx(src, src, MORPH_CLOSE, structuringElement);

    //Mostrar imagem
    namedWindow( "morph_transf", CV_WINDOW_NORMAL); // Create a window
    imshow( "morph_transf", src);
    waitKey(0);

    findContours(src, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    Mat drawing = Mat::zeros( src.size(), CV_8UC3 );
    for( int i = 0; i< contours.size(); i++){
        Scalar color( rand()&255, rand()&255, rand()&255 );
        drawContours( drawing, contours, i, color );
    }

    //Mostrar imagem
    namedWindow( "contours", CV_WINDOW_NORMAL); // Create a window
    imshow( "contours", drawing);
    waitKey(0);

    return 0;
  }    

1 Ответ

0 голосов
/ 16 февраля 2019

Более надежный способ - найти линии (линии Хафа) после Кенни, пересечь их и найти прямоугольники.Контуры не устойчивы к шуму.

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