2012-11-23 24 views
9

Tôi mới ở openCV vì thế phải vật lộn từ 3 đến 4 ngày qua, tôi đã phát hiện ranh giới tờ giấy, Bây giờ tôi muốn vẽ 4 vòng tròn trên các góc.Tìm góc của các giấy tờ

tôi vẽ ranh giới từ mã này

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); 

Tôi mới trong OpenCV, Vì vậy, Theo tôi tôi có điểm góc trên bên trái p-> x và p-> y, Nhưng làm thế nào tôi có được các góc khác , Tôi cũng nhầm lẫn trong tham số & n trong phương pháp polylines này, cách phương pháp polylines này vẽ hình chữ nhật hoàn chỉnh?

Khi tôi sử dụng bounding rect, Nó không hoàn hảo nó cung cấp cho không gian nhỏ trên mặt của tờ giấy.

Bất kỳ sự giúp đỡ rất cám ơn sự

code is:

- (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); 
//////////// 
} 

Cảm ơn

+0

Bạn có thể làm rõ cách bạn tìm thấy giấy không? Tối ưu bạn nên thêm mã. – dom

+0

@moosgummi vui lòng kiểm tra chỉnh sửa của tôi, tôi nghĩ ở đây tôi sử dụng một số phần mã hóa của bạn từ câu hỏi của bạn, cảm ơn bạn đã chia sẻ phần đó. – QueueOverFlow

Trả lời

18

Hãy để tham khảo my original code, mà chỉ đơn giản phát hiện ô vuông trên một hình ảnh.

Điều đó có nghĩa rằng trong phương pháp chính của ứng dụng mà bạn sẽ viết một cái gì đó giống như pseudo-code sau để gọi 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; 

Bí quyết dựa vào find_largest_square() trình bày dưới đây:

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

cảm ơn bạn, bạn là một phao cứu sinh =) –

+0

Hi làm thế nào để tôi có thể phát hiện giấy trắng nếu nó trên bàn trắng? ... tôi đã cố gắng với thay đổi quy mô màu xám & canny chuyển đổi bt m nt có thể tìm thấy tht rectngle .... thnks:) – user1140237

+0

Làm cách nào để tìm các góc của Hình chữ nhật xoay (hình chữ nhật có cạnh không song song với trục tọa độ)? –

Các vấn đề liên quan