2012-11-23 89 views
9

我是openCV中的新人,因此最近3到4天都在努力工作,我已經檢測到紙張邊界,現在我想在角落畫出4個圓圈。查找論文的角落

我從這個代碼繪製邊界

const cv::Point* p = &squares[i][0]; 

int n = (int)squares[i].size(); 

polylines(image, &p,&n, 1, true, Scalar(255,255,0), 5, CV_AA); 

我在OpenCV的是新的,所以在我看來我得左上角點P-> x和P-> Y,但我怎麼讓別人角落,我也在參數& n中混淆了這個多義線方法,這個多義線方法如何繪製完整的矩形?

當我使用邊界矩形,它不是完美的,它給紙面上的一點空間。

任何幫助,非常感謝

代碼:

- (cv::Mat)finshWork:(cv::Mat &)image 
{ 
// read in the apple (change path to the file) 
Mat img0 =image;// imread("/home/philipp/img/apple.jpg", 1); 

Mat img1; 
cvtColor(img0, img1, CV_RGB2GRAY); 

// apply your filter 
Canny(img1, img1, 100, 200); 

// find the contours 
vector< vector<cv::Point> > contours; 
findContours(img1, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); 

/////for SQUARE CODE 
std::vector<std::vector<cv::Point> > squares; 
std::vector<cv::Point> approx; 
for(size_t i = 0; i < contours.size(); i++) 
{ 
    cv::approxPolyDP(cv::Mat(contours[i]), approx, arcLength(cv::Mat(contours[i]), true)*0.02, true); 
    if(approx.size() == 4 && fabs(contourArea(cv::Mat(approx))) > 1000 && cv::isContourConvex(cv::Mat(approx))) { 
     double maxCosine = 0; 

     for(int j = 2; j < 5; j++) 
     { 
      double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1])); 
      maxCosine = MAX(maxCosine, cosine); 
     } 

     if(maxCosine < 0.3) { 
      squares.push_back(approx); 
      cv::Point newPoint = approx[0]; 

      NSLog(@"x is %d and y is %d",newPoint.x,newPoint.y); 
     } 
    } 
} 

const cv::Point* p = &squares[0][0]; 


int n = (int)squares[0].size(); 

NSLog(@"%d",n); 


//THIS IS WORKING CODE    

    polylines(image, &p,&n, 1, true, Scalar(0,0,255), 10, CV_AA); 
    //polylines(image, &p,&n, 1, true, Scalar(255,255,0), 5, CV_AA); 
//////////// 
} 

感謝

+0

你能澄清你如何找到這份報紙嗎?最好你應該添加更多的代碼。 – dom

+0

@moosgummi請檢查我的編輯,我想在這裏我使用你的問題的一部分編碼,感謝分享這部分。 – QueueOverFlow

回答

18

以供參考my original code,它只是檢測圖像上的正方形。

這意味着,在應用程序的主要方法,你會寫類似下面的僞代碼來調用find_squares()

Mat image = imread("test.jpg", 1); 

// Detect all regions in the image that are similar to a rectangle 
vector<vector<Point> > squares; 
find_squares(image, squares); 

// The largest of them probably represents the paper 
vector<Point> largest_square; 
find_largest_square(squares, largest_square); 

// Print the x,y coordinates of the square 
cout << "Point 1: " << largest_square[0] << endl; 
cout << "Point 2: " << largest_square[1] << endl; 
cout << "Point 3: " << largest_square[2] << endl; 
cout << "Point 4: " << largest_square[3] << endl; 

訣竅依靠find_largest_square()介紹如下:

void find_largest_square(const vector<vector<Point> >& squares, vector<Point>& biggest_square) 
{ 
    if (!squares.size()) 
    { 
      // no squares detected 
      return; 
    } 

    int max_width = 0; 
    int max_height = 0; 
    int max_square_idx = 0; 
    const int n_points = 4; 

    for (size_t i = 0; i < squares.size(); i++) 
    { 
      // Convert a set of 4 unordered Points into a meaningful cv::Rect structure. 
      Rect rectangle = boundingRect(Mat(squares[i])); 

    //  cout << "find_largest_square: #" << i << " rectangle x:" << rectangle.x << " y:" << rectangle.y << " " << rectangle.width << "x" << rectangle.height << endl; 

      // Store the index position of the biggest square found 
      if ((rectangle.width >= max_width) && (rectangle.height >= max_height)) 
      { 
        max_width = rectangle.width; 
        max_height = rectangle.height; 
        max_square_idx = i; 
      } 
    } 

    biggest_square = squares[max_square_idx]; 
} 
+1

謝謝你,你是一個救生員=) –

+0

嗨如何檢測白色紙張,如果它在白色桌子上?...我嘗試改變灰度和canny轉換BT能找到rectngle .... thnks: ) – user1140237

+0

如何查找旋轉的矩形(兩邊不平行於座標軸的矩形)的角點? –