2013-05-17 5 views
0

У меня есть изображение, как здесь ниже:Как обрабатывать координаты для контуров OpenCV?

Braille

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

#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv/cv.h> 
#include <iostream> 
#include <vector> 

int main(int argc, char **argv) 
{ 
    cv::Mat matSrc,matTmp,matDst; 
    cv::Mat matV,matROI; 
    std::vector<cv::Mat> vectorHSV; 
    std::vector<std::vector<cv::Point> > contours; 
    std::vector<cv::Vec4i> hierarchy; 
    matSrc = cv::imread(argv[1],1); 
// matSrc = cv::imread("123.jpg",1); 
// cv::imshow("Source", matSrc); 
    cv::cvtColor(matSrc,matTmp,CV_RGB2HSV); 
    cv::split(matTmp,vectorHSV); 
    matV = vectorHSV[2]; 
    matV.copyTo(matTmp); 
    cv::normalize(matTmp,matTmp,0,255,CV_MINMAX,CV_8UC1); 
    cv::medianBlur(matTmp,matTmp,5); 
    cv::adaptiveThreshold(matTmp,matTmp,255,CV_ADAPTIVE_THRESH_GAUSSIAN_C,CV_THRESH_BINARY_INV,125,7); 
    cv::equalizeHist(matTmp,matTmp); 
// cv::erode(matTmp,matTmp,cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3))); 
    cv::morphologyEx(matTmp,matTmp,cv::MORPH_CLOSE,cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3))); 
    cv::Canny(matTmp,matTmp,50,150,3); 
    cv::Rect ROI(0,0,matTmp.cols,matTmp.rows); 
    matROI = matTmp(ROI); 
    cv::findContours(matROI,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_TC89_KCOS,cv::Point(0,0)); 
    std::vector<cv::Moments> muDots(contours.size()); 
    std::vector<cv::Point> mcDots(contours.size()); 
    for(size_t c=0;c < contours.size();c++) 
    { 
     muDots[c] = cv::moments(contours[c],false); 
     mcDots[c] = cv::Point(static_cast<int>(muDots[c].m10/muDots[c].m00) , static_cast<int>(muDots[c].m01/muDots[c].m00)); 
    } 
    for(int allDots=0;allDots < mcDots.size();allDots++) 
    { 
     std::cout << allDots << ": " << mcDots[allDots].x << "," << mcDots[allDots].y << std::endl; 
    } 

    matTmp.copyTo(matDst); 
    imshow("ROI",matROI); 
// imshow("Result", matDst); 
    cv::waitKey(0); 
    return 0; 
} 

То, что я хочу спросить, как обрабатывать контуры, если он существует, или нет, в кратком описании я хочу сделать, как в этом алгоритме:

for(x=0;x < Image.cols;x++) 
    { 
     for(y=0;y < Image.rows;y++) 
     { 
      if(Contour coordinates at X,Y = Exist) 
      { 
       vectorBraille.push_back = 1; 
      } 
      else 
      { 
       vectorBraille.push_back = 0; 
      } 
     } 
    } 

Пожалуйста, мне действительно нужно предложение для эта проблема, я немного застрял здесь.

Любая помощь будет очень признательна. Спасибо

ответ

1

Создайте карту ответа с контурами. Используйте DrawContours с отверстием_color = external_color> 0. Прочитано this или this. Образец кода:

cv::Mat responsemap = cv::Mat::zeros(height, width, CV_8UC1); 
cv::DrawContours(responsemap, contours, external_color, hole_color, max_level, 1, 8); 
if (responsemap.at<uchar>(y,x)!=0) std::cout<<"contour area"; 

Если вам нужны только центры для печати на карте ответа, установите их вручную.

0

Похоже, вы пытаетесь распознать шрифт Брайля, не так ли?

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

cv::Mat mask = cv::Mat(img.rows, img.cols, CV_8UC1, CV:RGB(0,0,0)); 
    cv::Mat out = cv::Mat(img.rows, img.cols, CV_8UC1, CV:RGB(0,0,0)); 
    cv::circle(mask, cv::Point(X,Y),10, CV_RGB(255,255,255),-1); 
    (...) 
    img.copyTo(out,mask); 

Так вы создаете два черных Маты, которые имеют один и тот же тип и размер как ваше изображение (img), то вы рисуете белые круги на маске, в точках, где вы ожидаете Брайля точек. Наконец, вы используете cv :: copyTo, который принимает вход Mat, выходной Mat и маску.

На этом новом изображении вы запускаете определение контура. В результате вы обнаруживаете только точки, в которых вы их ожидаете.

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