C++ OpenCV摄像机校准,断言失败<;ni>;0&&;ni==ni1>;
我正在尝试使用C++ OpenCV摄像机校准,断言失败<;ni>;0&&;ni==ni1>;,c++,opencv,camera,assertion,calibration,C++,Opencv,Camera,Assertion,Calibration,我正在尝试使用openCV执行相机校准。在同一个示例中,来自openCV示例的数据非常有效,但我的源代码生成了一个错误: Assertion failed <ni > 0 && ni==ni1>... collectCallibrationData.. calibration.cpp line 3193" objectPoints and imagePoints are the same size. Changing other inputs dont
openCV
执行相机校准。在同一个示例中,来自openCV
示例的数据非常有效,但我的源代码生成了一个错误:
Assertion failed <ni > 0 && ni==ni1>... collectCallibrationData.. calibration.cpp line 3193"
objectPoints and imagePoints are the same size. Changing other inputs dont affect error code.
断言失败0&&ni==ni1>。。。收集振动数据。。校准。cpp第3193行“
objectPoints和imagePoints大小相同。更改其他输入不会影响错误代码。
有人能帮我处理吗?代码如下:
void main()//enter code here
{
//initial operations, declatarions etc
int *Asize; float *APoints;
float AAPoints[]= {/* My Array */};
int AAsize[] = {4,54,2}; //My array size
Asize = AAsize; APoints = AAPoints; // will be called as dll that is why this wierd attribution
int page = *(Asize); int row = *(Asize+1); int col = *(Asize +2);
Point3f pointBuf;
vector<vector<Point3f>> imagePoints;
vector<Point3f> vectBuf;
Size boardSize;
boardSize.height = 6; boardSize.width = 9;
Mat cameraMatrix, distCoeffs;
float squareSize=50;
//change 1d array to vector<vector<point3f>>
for (int i = 0; i<page; i++)
{
for (int j = 0; j<row; j++)
{
pointBuf.x = *(APoints + (i*(row*col))+j*2);
pointBuf.y = *(APoints + (i*(row*col))+j*2+1);
pointBuf.z = 0;
vectBuf.push_back(pointBuf);
}
imagePoints.push_back(vectBuf);
vectBuf.clear();
}
// create objectPoint vector<vector<Points3f>>
vector<vector<Point3f>> objectPoints;
vectBuf.clear();
for( int i = 0; i < boardSize.height; ++i )
{
for( int j = 0; j < boardSize.width; ++j )
vectBuf.push_back(Point3f(float( j*squareSize ), float( i*squareSize ), 0));
}
objectPoints.resize(imagePoints.size(),vectBuf);
//initialize starting variables for calibration
cameraMatrix = Mat::eye(3, 3, CV_64F);
distCoeffs = Mat::zeros(1, 1, CV_64F);
cameraMatrix.at<double>(0,0) = 1.0;
vector<Mat> rvecs, tvecs;
Size imageSize; imageSize.width = 2040; imageSize.height = 2040;
double rms = calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs);
}
void main()//在此处输入代码
{
//初始操作、脱口剂等
int*Asize;float*APoints;
浮点AAPoints[]={/*我的数组*/};
int AAsize[]={4,54,2};//我的数组大小
Asize=AAsize;APoints=AAPoints;//将被称为dll,这就是为什么wierd属性
int page=*(Asize);int行=*(Asize+1);int列=*(Asize+2);
点3f点buf;
向量成像点;
向量向量;
大小板大小;
boardSize.height=6;boardSize.width=9;
Mat cameraMatrix,distcoefs;
浮子平方大小=50;
//将一维数组更改为向量
对于(int i=0;i使用cv::calibleCamera()
时出现问题。它要求将std::vector
作为第一个参数,将std::vector
作为第二个参数
e、 g:
cv::Size imageSize(20402040);
cv::Mat cameraMatrix,distcoefs;
std::向量rvecs,tvecs;
std::向量图像点;
向量对象点;
//填充图像点和对象点
...
cv::CalibleCamera(对象点、图像点、图像大小、cameraMatrix、Discoefs、rvecs、TVEC);
我也遇到了同样的问题。在我的例子中,将vector>转换为InputArrayOfarray时出现了一个错误。
您可以运行以下示例代码在系统中进行检查
using namespace std;
using namespace cv;
/** @function main */
int main( void )
{
vector<Point3f> objectPoints_tmp(54);
objectPoints_tmp.clear();
for( int i = 0; i < 9; ++i )
for( int j = 0; j < 6; ++j )
objectPoints_tmp.push_back(Point3f(j*50, i*50, 0.0f));
vector<vector<Point3f> > objectPoints(7, objectPoints_tmp);
InputArrayOfArrays OBJPOINT = objectPoints; std::cout << (int) OBJPOINT.total() << std::endl;
for( int i = 0; i < 7; ++i )
std::cout << OBJPOINT.getMat(i).checkVector(3, CV_32F) << std::endl;
waitKey(0);
return 0;
}
在我的例子中,它打印出随机数
我猜opencv库不适合我的系统(win7 x64+vs2012)。我自己重建opencv后,它现在可以工作了。你可以使用google关键字“Win7x64 vs2012 opencv CMake TBB“好吧,我不明白。你说校准对样本数据有效,很好。它到底什么时候失败?你有什么不同吗?编辑我文章的人误解了我(我的英语不好)。我写道:“在同一个数据示例上(来自OPECV样本),效果很好。”
using namespace std;
using namespace cv;
/** @function main */
int main( void )
{
vector<Point3f> objectPoints_tmp(54);
objectPoints_tmp.clear();
for( int i = 0; i < 9; ++i )
for( int j = 0; j < 6; ++j )
objectPoints_tmp.push_back(Point3f(j*50, i*50, 0.0f));
vector<vector<Point3f> > objectPoints(7, objectPoints_tmp);
InputArrayOfArrays OBJPOINT = objectPoints; std::cout << (int) OBJPOINT.total() << std::endl;
for( int i = 0; i < 7; ++i )
std::cout << OBJPOINT.getMat(i).checkVector(3, CV_32F) << std::endl;
waitKey(0);
return 0;
}
7
54
54
54
54
54
54
54