我正在使用opencv进行相机标定。我正在使用"Cook book编程"中给出的相同代码。
我不知道我的代码出了什么问题。代码如下:-
int main()
{
CameraCalibrator calibrateCam;
std::vector<std::string> filelist;
char buff[100];
for(int i=0;i<21;i++)
{
sprintf(buff,"..\\Train\\3\\%d.jpg",i+1);
filelist.push_back(buff);
}
cv::Size boardSize(4,3);
double calibrateError;
int success;
success = calibrateCam.addChessboardPoints(filelist,boardSize);
}
class CameraCalibrator{
public:
std::vector<std::vector<cv::Point3f>> objectPoints;
std::vector<std::vector<cv::Point2f>> imagePoints;
//Square Lenght
float squareLenght;
//output Matrices
cv::Mat cameraMatrix; //intrinsic
cv::Mat distCoeffs;
//flag to specify how calibration is done
int flag;
//used in image undistortion
cv::Mat map1,map2;
bool mustInitUndistort;
public:
CameraCalibrator(): flag(0), squareLenght(36.0), mustInitUndistort(true){};
int addChessboardPoints(const std::vector<std::string>& filelist,cv::Size& boardSize){
std::vector<std::string>::const_iterator itImg;
std::vector<cv::Point2f> imageCorners;
std::vector<cv::Point3f> objectCorners;
//initialize the chessboard corners in the chessboard reference frame
//3d scene points
for(int i = 0; i<boardSize.height; i++){
for(int j=0;j<boardSize.width;j++){
objectCorners.push_back(cv::Point3f(float(i)*squareLenght,float(j)*squareLenght,0.0f));
}
}
//2D Image points:
cv::Mat image; //to contain chessboard image
int successes = 0;
for(itImg=filelist.begin(); itImg!=filelist.end(); itImg++){
image = cv::imread(*itImg,CV_LOAD_IMAGE_GRAYSCALE);
std::cout<<*itImg<<"\n";
bool found = cv::findChessboardCorners(image, boardSize, imageCorners);
cv::drawChessboardCorners(image, boardSize, imageCorners, found);
cv::cornerSubPix(image, imageCorners, cv::Size(5,5),cv::Size(-1,-1),
cv::TermCriteria(cv::TermCriteria::MAX_ITER+cv::TermCriteria::EPS,30,0.1));
//if we have a good board, add it to our data
if(imageCorners.size() == boardSize.area()){
addPoints(imageCorners,objectCorners);
successes++;
}
}
return successes;
}
void addPoints(const std::vector<cv::Point2f>& imageCorners,const std::vector<cv::Point3f>& objectCorners){
//2D image point from one view
imagePoints.push_back(imageCorners);
//corresponding 3D scene points
objectPoints.push_back(objectCorners);
}
double calibrate(cv::Size &imageSize){
mustInitUndistort = true;
std::vector<cv::Mat> rvecs,tvecs;
return
cv::calibrateCamera(objectPoints, //the 3D points
imagePoints,
imageSize,
cameraMatrix, //output camera matrix
distCoeffs,
rvecs,tvecs,
flag);
}
void remap(const cv::Mat &image, cv::Mat &undistorted){
std::cout << cameraMatrix;
if(mustInitUndistort){ //called once per calibration
cv::initUndistortRectifyMap(
cameraMatrix,
distCoeffs,
cv::Mat(),
cameraMatrix,
image.size(),
CV_32FC1,
map1,map2);
mustInitUndistort = false;
}
//apply mapping functions
cv::remap(image,undistorted,map1,map2,cv::INTER_LINEAR);
}
};
在相机标定类,它打开图像成功但它失败findChessboardCorners行...
首先,在cv::findChessboardCorners
中,您的boardSize
是错误的,您将其定义为cv::Size boardSize(4,3)
什么时候应该是
cv::Size boardSize(5,4)
因为你的棋盘每行有5个内角,每列有4个内角。
此外,如果找不到角点,您应该添加一个检入。在你的代码里
bool found = cv::findChessboardCorners(image, boardSize, imageCorners);
继续并调用函数,如
cv::drawChessboardCorners
和cv::cornerSubPix
,如果没有角点,这些函数将不起作用。这一部分应该是:
for(itImg=filelist.begin(); itImg!=filelist.end(); itImg++)
{
image = cv::imread(*itImg,CV_LOAD_IMAGE_GRAYSCALE);
std::cout<<*itImg<<"\n";
bool found = cv::findChessboardCorners(image, boardSize, imageCorners);
if (found) // continue only if corners have been found
{
cv::drawChessboardCorners(image, boardSize, imageCorners, found);
cv::cornerSubPix(image, imageCorners, cv::Size(5,5),cv::Size(-1,-1), cv::TermCriteria(cv::TermCriteria::MAX_ITER+cv::TermCriteria::EPS,30,0.1));
//if we have a good board, add it to our data
if(imageCorners.size() == boardSize.area())
{
addPoints(imageCorners,objectCorners);
successes++;
}
}
else // if no corners found
{
std::cout<<"No corners found in image"<<std::endl;
// Do anything else you want here
}
}
此外,为什么你的黑色方块周围有红色边框?我还没有研究过
cv::findChessboardCorners
到底是如何检测角落的,但这很可能导致算法失败。你可以尝试使用没有它的新板吗?当我们在做的时候,上角的光反射也可以发挥一些作用,因为那里的黑色的强度值是非常浅的灰色。你在OpenCV提供的示例图像中尝试过你的算法吗?
摄像机旋转后,坐标让我摸不着头脑。 我有一个照相机,一个角色和一张地图。这个玩家只能在以下方向行走:北(90°),南(270°),东(0°),西(180°)。 从玩家的camera.RotateRound(...,...,...)位置旋转摄像机后,玩家开始在旋转的结果中向新的方向移动。 null
我尝试用python和C++实现代码,结果相同。还尝试另存为。png而不是。jpg。rtsp feed在使用imshow显示相机时工作正常,只有在试图保存帧时才会出现问题。据我所知,这些错误都与ffmpeg有关,但是google对这些类型的错误帮助不大。
我在使用OpenCV的cv2时遇到了一个非常奇怪的问题。Emacs中python shell中的Canny()函数。当我运行,我收到了错误消息 OpenCV错误:CV::Canny文件D:\Build\OpenCV\OpenCV-3.2.0\modules\imgproc\src\Canny中的断言失败(深度==cv8u)。cpp,第845行回溯(最后一次调用):文件“”,第1行,文件“./mys
我是android studio和手机应用程序开发的初学者,但我仍在努力学习。因此,我设法构建了我的第一个webview应用程序来显示页面和图片。我发现了许多有用的资源来帮助我这样做,但我仍然面临着一个问题,即如何直接上传从手机摄像头(而不是从图库)拍摄的照片并上传到服务器。 1-在我按下眉毛按钮后,应用程序会提示我是从相机还是从画廊拍摄照片。(Android版9)2-当我从图库上传一张照片时,应
问题内容: 有一个类似的问题,但尚未解决: W /CameraBase:连接相机时发生错误:camera.open()调用为0 我有一个(自然)正在使用相机的应用程序。它一直很好。但是,如果在构建之间没有代码更改,则应用程序开始崩溃(通过Git提交历史记录验证没有代码更改)。 为了进一步验证问题是否出在硬件中,我在另一部手机上运行了相同的代码,并且工作正常。相机以某种方式被锁定,无法打开。 以下是
OpenCV错误:未指定的错误(该函数未实现。使用Windows、GTK 2.x或Carbon支持重建库。如果您在Ubuntu或Debian上,请安装libgtk2.0-dev和pkg config,然后重新运行cmake或configure脚本),位于cvShowImage的/io/OpenCV/modules/highgui/src/window文件中。cpp,第545行回溯(最后一次调用):