2015-07-15 15 views
5

Tôi cũng đã hỏi điều này trên diễn đàn OpenCV, đang thử vận ​​may của mình ở nơi khác. Tôi đang sử dụng OpenCV 3.0 trong Visual Studio Professional 2013.Vấn đề OpenCV với findChessboardCorners

Vì vậy, tôi đang cố hiệu chỉnh máy ảnh bằng mã hướng dẫn trong hướng dẫn calib3d và this. Tôi tiếp tục nhận được cùng một lỗi hơn và hơn (std :: length_error tại vị trí bộ nhớ) và tôi đã truy tìm nó đến nơi tôi cố gắng và thêm vector góc cho từ findChessboardCorners vào vector image_points ở dòng cuối cùng của mã của tôi.

image_points.push_back(corners); 

Trong cửa sổ gỡ lỗi, kích thước của góc được liệt kê như: góc {size = 2305843009213050645}, mà rõ ràng là cách quá lớn (chỉ có 35 góc trong hình ảnh chuẩn Tôi đang sử dụng).

Mã hướng dẫn bị rút gọn bên dưới, mặc dù tôi đã phân lập lại vấn đề này để tìmChọnBài viếtCó vẻ như là một vectơ góc dường như vô nghĩa. Phần lạ là không có vấn đề gì khi vẽ các góc trên ảnh hiệu chỉnh tôi đang sử dụng-- nó xuất hiện như thể các góc được hiệu chỉnh hoàn hảo. Vậy vấn đề ở đây là gì? Tôi thực sự không biết tại sao findChessboardCorners sẽ cho tôi một vectơ góc lớn mà tôi thậm chí không thể thêm nó vào danh sách các vectơ.

using namespace cv; 
using namespace std; 

int main(int argc, char** argv){ 

int numBoards = 1; 
int numCornersHor=7; 
int numCornersVer=5; 

int numSquares = numCornersHor * numCornersVer; 
Size board_sz = Size(numCornersHor, numCornersVer); 

vector<vector<Point3f>> object_points; 
vector<vector<Point2f>> image_points; 

vector<Point2f> corners; 

int successes = 0; 

Mat large_image; 
Mat image; 
Mat gray_image; 
large_image = imread(argv[1], IMREAD_COLOR); 
resize(large_image, image, Size(), .5, .5); 

vector<Point3f> obj; 
for (int j = 0; j<numSquares; j++) 
    obj.push_back(Point3f((j/numCornersHor)*29, (j%numCornersHor)*29, 0.0f)); 

if (image.empty()) 
     return(0); 
else if (image.channels()>1) 
    cvtColor(image, gray_image, CV_BGR2GRAY); 
else gray_image = image; 

bool found = findChessboardCorners(image, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_NORMALIZE_IMAGE); 


if (found) 
{ 
    cornerSubPix(gray_image, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1)); 

    drawChessboardCorners(gray_image, board_sz, corners, found); 

} 

imshow("win1", image);  
imshow("win2", gray_image); 

int key = waitKey(1); 
if (key == 27) 
    return 0; 

image_points.push_back(corners); 
} 

Trả lời

1

Đã tìm ra. Vấn đề là một lỗi trong findChessboardCorners-- các góc bị thay đổi kích thước không đúng trong chính hàm đó, khiến cho nó bị nổ tung. Đã tìm thấy sự cố và nhận được bản sửa lỗi từ here, mặc dù tôi phải chuyển đổi các góc quay lại vectơ sau khi tôi chạy chức năng đã sửa.

đang Cập nhật:

Mat pointBuf; 

found = actually_findChessboardCorners(image, board_sz, pointBuf, 
      CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FAST_CHECK | CALIB_CB_NORMALIZE_IMAGE); 

corners.assign((Point2f*)pointBuf.datastart, (Point2f*)pointBuf.dataend); 

sử dụng chức năng này:

bool actually_findChessboardCorners(Mat& frame, Size& size, Mat& corners, int flags) { 
int count = size.area() * 2; 
corners.create(count, 1, CV_32FC2); 
CvMat _image = frame; 
bool ok = cvFindChessboardCorners(&_image, size, 
    reinterpret_cast<CvPoint2D32f*>(corners.data), 
    &count, flags) > 0; 
return ok; 

}

+0

tôi đã sử dụng giải pháp bạn và vẫn có sự khẳng định thất bại trong vấn đề với 'cornerSubPix'. Bạn có vấn đề này? – Misaki