我正在尝试校准罗技c930相机,并在遵循我认为的样本校准代码时不断出现异常。
我在Win 8.1机器上使用OpenCV 2.4.9和VS2012 c ++ / cli。我试图遵循以下教程代码:
C:\opencv\sources\samples\cpp\tutorial_code\calib3d\camera_calibration\camera_calibration.cpp
。
我的代码如下:
while(successes<CALIBRATE_NUMBER_OF_BOARDS_TO_MATCH && totalframes<CALIBRATE_TOTAL_FRAMES)
{
// check for new image
if(CameraVI->isFrameNew(CameraNumber))
{
vector<Point2f> pointBuf;
TermCriteria criteria = TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 );
totalframes++;
// load the image from the buffer
CameraVI->getPixels(CameraNumber, LdataBuffer, false, true);
// convert it to a mat
cv::Mat tImage(Images->Height, Images->Width, CV_8UC3, LdataBuffer, Mat::AUTO_STEP);
bool found = findChessboardCorners(tImage, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FAST_CHECK| CV_CALIB_CB_NORMALIZE_IMAGE);
if(found)
{
successes++;
cvtColor(tImage,grayImage,CV_BGR2GRAY);
cornerSubPix( grayImage, pointBuf, Size(11,11), Size(-1,-1), criteria);
imagePoints.push_back(pointBuf);
}
drawChessboardCorners( tImage, board_sz, Mat(pointBuf), found );
}
Sleep(35);
}
当我运行它时,我一直在cornerSubPix调用上获得异常。我知道进入的图像是正确的(它是1920 x 1080),因为我可以将图像显示在屏幕上。此外,pointBuf似乎已正确定义,我可以在cornerSubPix调用之前访问它。我注意到的一件事是一些例子使用CV_BGR2GRAY进行颜色转换,而其他例子使用CV_RGB2GRAY。我试过两个但仍然得到例外。一些示例还使用5x5而不是11x11窗口。我也试过了两个但仍然得到例外。
答案 0 :(得分:0)
我认为这是愚蠢的。我将findChessboardCorners找到的点存储在一个向量(角落)中,但是使用不同的向量(pointBuf)进行cornerSubPix调用。 cornerSubPix显然不喜欢空向量。不知道为什么我的try / catch调用没有报告这个。