2013-02-22 28 views
13

Tôi có thể sử dụng chức năng FindChessboardCorners cho hình ảnh có kích thước nhỏ hơn 15 Mega như 2k x 1.5k. tuy nhiên khi tôi sử dụng nó trên hình ảnh từ DSLR, độ phân giải 3700x5300, nó không hoạt động.FindChessboardCorners không thể phát hiện bàn cờ trên hình ảnh rất lớn bằng ống kính tiêu cự dài

Tôi đã cố gắng sử dụng thay đổi kích thước() để giảm kích thước hình ảnh trực tiếp, sau đó nó hoạt động.

Rõ ràng có một số mã hóa hoặc lỗi cứng trong mã nguồn OpenCV.

Bạn có thể giúp tôi tìm ra hoặc chỉ cho tôi một bản vá cho điều này không?

Tôi thấy một người nào đó đã đăng sự cố tương tự vào năm 2006, here, vì vậy có vẻ như vấn đề vẫn còn.

Code tôi sử dụng cũng giống như

found = findChessboardCorners(viewGray, boardSize, ptvec, 
           CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK); 

Cập nhật

Chỉ cần vào đây để làm rõ. Tôi nghĩ rằng thuật toán hoạt động trên độ phân giải hình ảnh lớn, nhưng nó không thành công khi bàn cờ chiếm tỷ lệ lớn hơn của hình ảnh. Ví dụ, khi tôi sử dụng một ống kính cố định 50mm trên cùng một vị trí máy ảnh, FindChessboardCorners không bao giờ thất bại. Sau khi tôi đổi nó thành ống kính cố định 100mm, chức năng bắt đầu dừng phát hiện mẫu. Tôi nghĩ rằng nó liên quan đến tỷ lệ hoặc tiêu cự.

Hình ảnh dưới đây là kết quả ống kính 100mm.

Cập nhật 2

tôi đã thêm một bộ lọc làm sắc nét cho hình ảnh lớn, và nó bắt đầu để khắc phục vấn đề.

Trước hết tôi sử dụng

//do a sharpen filter for the large resolution image 
if (viewGray.cols > 1500) 
{ 
    Mat temp ; 
    GaussianBlur(viewGray,temp, Size(0,0), 105) ; //hardcoded filter size, to be tested on 50 mm lens 
    addWeighted(viewGray, 1.8, temp, -0.8,0,viewGray) ; //hardcoded weight, to be tested. 
//imwrite("test"+ imageList[k][i], viewGray) ; 

} 

found = findChessboardCorners(viewGray, boardSize, ptvec, 
CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK); 

tải lên các hình ảnh:

Một hình ảnh jpg ở độ phân giải gốc 3744 x 5616, nếu lực lượng trang web này chuyển đổi, sau đó hãy chắc chắn rằng bạn đang sử dụng ở độ phân giải đúng .

A jpg image at original resolution 3744 x 5616, if this site force convert, then make sure you are using at the correct resolution.

+0

bạn có thể tải lên hình ảnh? Ngoài ra, nó sụp đổ hoặc nó chỉ trả về sai? – Sassa

+0

@Chrys, đã tải lên hình ảnh –

+0

có thể là vấn đề với hình ảnh không? bạn sử dụng loại f-stop nào? có lẽ độ sâu trường thấp có thể gây nhầm lẫn cho thuật toán? nhìn vào góc dưới cùng bên phải nó hơi bị mờ? – Alex

Trả lời

21

Một vài điểm.

  1. Giảm kích thước, như bạn thấy, giúp trình phát hiện. Đó là bởi vì các bộ lọc phát hiện góc được sử dụng trong OpenCV để tìm các góc có kích thước cố định và kích thước mặt nạ chập có thể quá nhỏ để phát hiện các góc của bạn - hình ảnh kích thước đầy đủ thực sự có vẻ "mượt" ở quy mô đó, đặc biệt nơi nó hơi mờ. Tuy nhiên, do downscaling bạn vứt bỏ một số độ chính xác vị trí góc.
  2. Vì lý do tương tự, việc mài cũng giúp ích. Tuy nhiên, nó cũng đi ngược lại độ chính xác, bởi vì nó thêm độ lệch cho vị trí subpixel của các góc - ngay cả trong trường hợp lý tưởng không có tiếng ồn. Để thuyết phục bản thân, hãy xem xét tương tự 1D: cường độ của hình ảnh xung quanh một góc (trong 1D, chuyển đổi màu đen-trắng sắc nét) trông lý tưởng giống như đường cong sigmoid (đoạn đường nối với các góc trơn) và bạn muốn để tìm vị trí của điểm uốn của nó. Làm sắc nét làm cho đường cong dốc hơn, nói chung sẽ di chuyển vị trí của điểm đó.Mọi thứ trở nên tồi tệ hơn khi bạn xem xét việc mài sắc thường khuếch đại tiếng ồn.
  3. Cách chính xác có thể tiến hành là bắt đầu ở độ phân giải thấp hơn (ví dụ: giảm kích thước), sau đó mở rộng vị trí của các góc, và sử dụng chúng làm ước tính ban đầu cho chạy cvFindCornersSubpix ở độ phân giải đầy đủ.
+1

Cảm ơn Franco, điểm 3 có thể hữu ích cho tôi. –

+1

Bạn được chào đón. Tôi cũng nhận thấy trong hình ảnh của bạn rằng mục tiêu dường như đã được dán trên một số loại hoặc bọt hoặc ván chân tường hỗ trợ. Tôi nhiệt liệt khuyên bạn nên sử dụng thứ gì đó cứng nhắc và phẳng hơn - đặc biệt nếu bạn muốn tận dụng toàn bộ độ phân giải của cảm biến DSLR hiện đại. Xem câu trả lời của tôi ở đây: http://stackoverflow.com/questions/12794876/how-to-verify-the-correctness-of-calibration-of-a-webcam –

+0

đó là một ván chân tường đặc biệt tương tự với bọt, nhưng tôi nghĩ rằng nó khá bằng phẳng. Tôi đã thử đề nghị của bạn điểm 3, và nó có tác dụng tương tự như một bộ lọc sắc nét, nhưng tôi nghĩ rằng tôi chọn phương pháp của bạn bởi vì nó sẽ làm cho findchessboardcorner nhanh hơn ở độ phân giải thấp hơn, đó là quan trọng cho hình ảnh res cao. Vấn đề là ống kính tiêu cự cố định 100mm tôi sử dụng, độ sâu trường ảnh trên ống kính này quá ngắn tạo ra nhiều mờ, tôi sẽ cố gắng sử dụng mống mắt nhỏ hơn và xem nó có cải thiện không. –

1

Nếu bạn có quyền truy cập vào nguồn OpenCV và có thể tạo lại nguồn đó, thì có thể bạn có thể gỡ lỗi hành vi của cvFindChessboardCorners.

Bạn phải #defineDEBUG_CHESSBOARD và sau đó bạn sẽ có một số trợ giúp để hiểu thuật toán.

Tôi nghĩ rằng OpenCV 2.4 có khả năng này (xem ví dụ https://github.com/Itseez/opencv/blob/2.4/modules/calib3d/src/calibinit.cpp).

Hơn nữa, ngay cả khi nó dường như không áp dụng đối với trường hợp của bạn, OpenCV doc đưa ra một yêu cầu cho mục tiêu hiệu chuẩn:

Note: Chức năng đòi hỏi không gian trắng (như một hình vuông dày biên giới, càng rộng càng tốt) xung quanh bảng để làm cho việc phát hiện mạnh mẽ hơn trong các môi trường khác nhau. Nếu không, nếu không có đường viền và hậu cảnh tối, các ô đen bên ngoài không thể là được phân đoạn đúng cách và do đó, thuật toán nhóm và đặt hàng theo phương vuông không thành công.

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners

+0

Nó có viền trắng xung quanh bàn cờ. Lời khuyên của tôi ở đây là sử dụng mẫu hiệu chuẩn tại https://github.com/Itseez/opencv/blob/master/samples/cpp/calibration.cpp. Nó sẽ cho bạn biết khi nào các góc được tìm thấy. Tôi sửa đổi if (found) {... drawChessboardCorners (...);} và bao gồm một khối khác mà chỉ cout-s khi góc không được tìm thấy để tôi có thể theo dõi trên hình ảnh một cách phong nha hơn. – rbaleksandar

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