2013-05-17 572 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,其中hole_color = external_color> 0。 閱讀thisthis。示例代碼:

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和一個掩碼。

在這個新圖像上運行輪廓檢測。因此,您只能檢測到您期望的點。