嗨,我正在做一個項目,做一個圖像三維重建。我是校準相機的階段,這需要很長時間才能完成。但是,當我編譯代碼並在相機前面顯示棋盤時,它會直接處理異常錯誤。攝像機校準opencv
當圖片不在框架中時,只要框架中沒有錯誤,未處理的錯誤就會發生,我不知道爲什麼。
我問過很多人,沒有任何身體可以幫忙。
這裏是我的代碼
#include <cv.h>
#include <highgui.h>
#include <vector>
#include <stdlib.h>
#include <stdio.h>
using namespace cv;
using namespace std;
int main()
{
int numBoards = 0;
int numCornersHor;
int numCornersVer;
printf("Enter number of corners along width: ");
scanf("%d", &numCornersHor);
printf("Enter number of corners along height: ");
scanf("%d", &numCornersVer);
printf("Enter number of boards: ");
scanf("%d", &numBoards);
int numSquares = numCornersHor * numCornersVer;
Size board_sz = Size(numCornersHor, numCornersVer);
VideoCapture capture = VideoCapture(0);
vector<vector<Point3d>> object_points;
vector<vector<Point2d>> image_points;
vector<Point2d> corners;
int successes=0;
Mat image;
Mat gray_image;
capture >> image;
vector<Point3d> obj;
for(int j=0;j<numSquares;j++)
obj.push_back(Point3d(j/numCornersHor, j%numCornersHor, 0.0f));
while(successes<numBoards)
{
cvtColor(image, gray_image, CV_BGR2GRAY);
bool found = findChessboardCorners(image, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
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);
capture >> image;
int key = waitKey(1);
if(key==27)
return 0;
if(key==' ' && found!=0)
{
image_points.push_back(corners);
object_points.push_back(obj);
printf("Snap stored!\n");
successes++;
if(successes>=numBoards)
break;
}
}
Mat intrinsic = Mat(3, 3, CV_32FC1);
Mat distCoeffs;
vector<Mat> rvecs;
vector<Mat> tvecs;
intrinsic.ptr<float>(0)[0] = 1;
intrinsic.ptr<float>(1)[1] = 1;
calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs);
Mat imageUndistorted;
while(1)
{
capture >> image;
undistort(image, imageUndistorted, intrinsic, distCoeffs);
imshow("win1", image);
imshow("win2", imageUndistorted);
waitKey(1);
}
capture.release();
return 0;
}
我得到的控制檯上的錯誤是
OpenCV的錯誤:斷言失敗(ncorners> = 0 & & corners.depth()== CV_32F)未知功能文件,文件..... \ SRC \ OpenCV的\模塊\ imgproc的\ src \ cornersubpix.cpp,線257
和錯誤對話框說
basiccalibration.exe中的0x769afc16未處理的異常:Microsoft C++異常:cv ::內存位置0x0021f51c處的異常..
幫助將不勝感激。 謝謝
opencv軟件包內有一個示例代碼來校準攝像頭,您使用的是? – 2013-02-13 21:22:49
不,我想寫我自己的代碼。我試過,但它有太多的錯誤,如未定義的函數。 – 2013-02-15 15:16:16
我正在嘗試運行與您相同的代碼。其實我的代碼有點不一樣,但是我修改了它來讓一些東西接近你並嘗試在這裏解決我的問題。一些問題: 在你的最終版本中,你真的使用numCornersHor兩次?爲什麼你不使用numCornersVer作爲第二個參數? 當你聲明它們時你是否將它們定義爲float?謝謝你的幫助! – user2414816 2013-07-19 14:46:52