摄像机标定:c++怎么读取txt文件命名的jpg格式图片,并且用于摄像机标定

1,2,3,。。,7图片保存在calibration文件夹里面。请问怎么打开这些标定板图片,然后用于摄像机标定?谢谢。图片是我的txt文件内容,看有没有错误??在代码之中... 1,2,3,。。,7图片保存在calibration文件夹里面。请问怎么打开这些标定板图片,然后用于摄像机标定?谢谢。图片是我的txt文件内容,看有没有错误??在代码之中应该怎么导入呢?char filename[]="c.txt"; 我把c.txt放到了工程目录里面了。最好是来个比较实际的例子。 展开
 我来答
沉默的狮心卍
2018-04-19
知道答主
回答量:1
采纳率:0%
帮助的人:878
展开全部

最近也在做相机标定,这个程序应该能帮助你,读取txt格式下图片路径,从而读取图片

参考博文:网页链接

下面是相机标定全部程序

// Xiang_Ji_Biao_Ding.cpp: 定义控制台应用程序的入口点。

//相机标定与畸变校正

#include "stdafx.h"

#include "opencv2/core/core.hpp"    

#include "opencv2/imgproc/imgproc.hpp"    

#include "opencv2/calib3d/calib3d.hpp"    

#include "opencv2/highgui/highgui.hpp"    

#include <iostream>    

#include <fstream>    

using namespace cv;

using namespace std;

void main()

{

ifstream fin("calibdata.txt"); /* 标定所用图像文件的路径 */

ofstream fout("caliberation_result.txt");  /* 保存标定结果的文件 */

//读取每一幅图像,从中提取出角点,然后对角点进行亚像素精确化     

cout << "开始提取角点………………";

int image_count = 0;  /* 图像数量 */

Size image_size;  /* 图像的尺寸 */

Size board_size = Size(4, 6);    /* 标定板上每行、列的角点数 */

vector<Point2f> image_points_buf;  /* 缓存每幅图像上检测到的角点 */

vector<vector<Point2f>> image_points_seq; /* 保存检测到的所有角点 */

string filename;

int count = -1;//用于存储角点个数。    

while (getline(fin, filename))    //将行读入字符串,fin为文件,filename为字符串

{

image_count++; /* 图像数量++ */

// 用于观察检验输出    

cout << "image_count = " << image_count << endl;

/* 输出检验*/

cout << "-->count = " << count;

Mat imageInput = imread(filename);

if (image_count == 1)  //读入第一张图片时获取图像宽高信息    

{

image_size.width = imageInput.cols;

image_size.height = imageInput.rows;

cout << "image_size.width = " << image_size.width << endl;

cout << "image_size.height = " << image_size.height << endl;

}

/* 提取角点 */

if (0 == findChessboardCorners(imageInput, board_size, image_points_buf))

{

cout << "can not find chessboard corners!\n"; //找不到角点    

exit(1);

}

else

{

Mat view_gray;

cvtColor(imageInput, view_gray, CV_RGB2GRAY);

/* 亚像素精确化 */

find4QuadCornerSubpix(view_gray, image_points_buf, Size(5, 5)); //对粗提取的角点进行精确化    

//cornerSubPix(view_gray,image_points_buf,Size(5,5),Size(-1,-1),TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,0.1));    

image_points_seq.push_back(image_points_buf);  //保存亚像素角点    

/* 在图像上显示角点位置 */

drawChessboardCorners(view_gray, board_size, image_points_buf, false); //用于在图片中标记角点    

imshow("Camera Calibration", view_gray);//显示图片    

waitKey(500);//暂停0.5S           

}

}

int total = image_points_seq.size();

cout << "total = " << total << endl;

int CornerNum = board_size.width*board_size.height;  //每张图片上总的角点数    

for (int ii = 0; ii<total; ii++)

{

if (0 == ii % CornerNum)// 24 是每幅图片的角点个数。此判断语句是为了输出 图片号,便于控制台观看     

{

int i = -1;

i = ii / CornerNum;

int j = i + 1;

cout << "--> 第 " << j << "图片的数据 --> : " << endl;

}

if (0 == ii % 3)  // 此判断语句,格式化输出,便于控制台查看    

{

cout << endl;

}

else

{

cout.width(10);

}

//输出所有的角点    

cout << " -->" << image_points_seq[ii][0].x;

cout << " -->" << image_points_seq[ii][0].y;

}

cout << "角点提取完成!\n";

//以下是摄像机标定    

cout << "开始标定………………";

/*棋盘三维信息*/

Size square_size = Size(10, 10);  /* 实际测量得到的标定板上每个棋盘格的大小 */

vector<vector<Point3f>> object_points; /* 保存标定板上角点的三维坐标 */

/*内外参数*/

Mat cameraMatrix = Mat(3, 3, CV_32FC1, Scalar::all(0)); /* 摄像机内参数矩阵 */

vector<int> point_counts;  // 每幅图像中角点的数量    

Mat distCoeffs = Mat(1, 5, CV_32FC1, Scalar::all(0)); /* 摄像机的5个畸变系数:k1,k2,p1,p2,k3 */

vector<Mat> tvecsMat;  /* 每幅图像的旋转向量 */

vector<Mat> rvecsMat; /* 每幅图像的平移向量 */

/* 初始化标定板上角点的三维坐标 */

int i, j, t;

for (t = 0; t<image_count; t++)

{

vector<Point3f> tempPointSet;

for (i = 0; i<board_size.height; i++)

{

for (j = 0; j<board_size.width; j++)

{

Point3f realPoint;

/* 假设标定板放在世界坐标系中z=0的平面上 */

realPoint.x = i * square_size.width;

realPoint.y = j * square_size.height;

realPoint.z = 0;

tempPointSet.push_back(realPoint);

}

}

object_points.push_back(tempPointSet);

}

/* 初始化每幅图像中的角点数量,假定每幅图像中都可以看到完整的标定板 */

for (i = 0; i<image_count; i++)

{

point_counts.push_back(board_size.width*board_size.height);

}

/* 开始标定 */

calibrateCamera(object_points, image_points_seq, image_size, cameraMatrix, distCoeffs, rvecsMat, tvecsMat, 0);

cout << "标定完成!\n";

//对标定结果进行评价    

cout << "开始评价标定结果………………\n";

double total_err = 0.0; /* 所有图像的平均误差的总和 */

double err = 0.0; /* 每幅图像的平均误差 */

vector<Point2f> image_points2; /* 保存重新计算得到的投影点 */

cout << "\t每幅图像的标定误差:\n";

fout << "每幅图像的标定误差:\n";

for (i = 0; i<image_count; i++)

{

vector<Point3f> tempPointSet = object_points[i];

/* 通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到新的投影点 */

projectPoints(tempPointSet, rvecsMat[i], tvecsMat[i], cameraMatrix, distCoeffs, image_points2);

/* 计算新的投影点和旧的投影点之间的误差*/

vector<Point2f> tempImagePoint = image_points_seq[i];

Mat tempImagePointMat = Mat(1, tempImagePoint.size(), CV_32FC2);

Mat image_points2Mat = Mat(1, image_points2.size(), CV_32FC2);

for (int j = 0; j < tempImagePoint.size(); j++)

{

image_points2Mat.at<Vec2f>(0, j) = Vec2f(image_points2[j].x, image_points2[j].y);

tempImagePointMat.at<Vec2f>(0, j) = Vec2f(tempImagePoint[j].x, tempImagePoint[j].y);

}

err = norm(image_points2Mat, tempImagePointMat, NORM_L2);

total_err += err /= point_counts[i];

std::cout << "第" << i + 1 << "幅图像的平均误差:" << err << "像素" << endl;

fout << "第" << i + 1 << "幅图像的平均误差:" << err << "像素" << endl;

}

std::cout << "总体平均误差:" << total_err / image_count << "像素" << endl;

fout << "总体平均误差:" << total_err / image_count << "像素" << endl << endl;

std::cout << "评价完成!" << endl;

//保存定标结果        

std::cout << "开始保存定标结果………………" << endl;

Mat rotation_matrix = Mat(3, 3, CV_32FC1, Scalar::all(0)); /* 保存每幅图像的旋转矩阵 */

fout << "相机内参数矩阵:" << endl;

fout << cameraMatrix << endl << endl;

fout << "畸变系数:\n";

fout << distCoeffs << endl << endl << endl;

for (int i = 0; i<image_count; i++)

{

fout << "第" << i + 1 << "幅图像的旋转向量:" << endl;

fout << tvecsMat[i] << endl;

/* 将旋转向量转换为相对应的旋转矩阵 */

Rodrigues(tvecsMat[i], rotation_matrix);

fout << "第" << i + 1 << "幅图像的旋转矩阵:" << endl;

fout << rotation_matrix << endl;

fout << "第" << i + 1 << "幅图像的平移向量:" << endl;

fout << rvecsMat[i] << endl << endl;

}

std::cout << "完成保存" << endl;

fout << endl;

/************************************************************************

显示定标结果

*************************************************************************/

Mat mapx = Mat(image_size, CV_32FC1);

Mat mapy = Mat(image_size, CV_32FC1);

Mat R = Mat::eye(3, 3, CV_32F);

std::cout << "保存矫正图像" << endl;

string imageFileName;

std::stringstream StrStm;

for (int i = 0; i != image_count; i++)

{

std::cout << "Frame #" << i + 1 << "..." << endl;

initUndistortRectifyMap(cameraMatrix, distCoeffs, R, cameraMatrix, image_size, CV_32FC1, mapx, mapy);

StrStm.clear();

imageFileName.clear();

string filePath = "chess";

StrStm << i + 1;

StrStm >> imageFileName;

filePath += imageFileName;

filePath += ".bmp";

Mat imageSource = imread(filePath);

Mat newimage = imageSource.clone();

//另一种不需要转换矩阵的方式    

//undistort(imageSource,newimage,cameraMatrix,distCoeffs);    

remap(imageSource, newimage, mapx, mapy, INTER_LINEAR);

StrStm.clear();

filePath.clear();

StrStm << i + 1;

StrStm >> imageFileName;

imageFileName += "_d.jpg";

imwrite(imageFileName, newimage);

}

std::cout << "保存结束" << endl;

return;

}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
楚霄06自力更生
2016-06-21 · 知道合伙人软件行家
楚霄06自力更生
知道合伙人软件行家
采纳数:346 获赞数:941

向TA提问 私信TA
展开全部
一、BMP格式

BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。所以,目前BMP在单机上比较流行。

二、GIF格式

GIF是英文Graphics Interchange Format(图形交换格式)的缩写。顾名思义,这种格式是用来交换图片的。事实上也是如此,上世纪80年代,美国一家著名的在线信息服务机构CompuServe针对当时网络传输带宽的限制,开发出了这种GIF图像格式。

GIF格式的特点是压缩比高,磁盘空间占用较少,所以这种图像格式迅速得到了广泛的应用。 最初的GIF只是简单地用来存储单幅静止图像(称为GIF87a),后来随着技术发展,可以同时存储若干幅静止图象进而形成连续的动画,使之成为当时支持2D动画为数不多的格式之一(称为GIF89a),而在GIF89a图像中可指定透明区域,使图像具有非同一般的显示效果,这更使GIF风光十足。目前Internet上大量采用的彩色动画文件多为这种格式的文件,也称为GIF89a格式文件。

此外,考虑到网络传输中的实际情况,GIF图像格式还增加了渐显方式,也就是说,在图像传输过程中,用户可以先看到图像的大致轮廓,然后随着传输过程的继续而逐步看清图像中的细节部分,从而适应了用户的"从朦胧到清楚"的观赏心理。目前Internet上大量采用的彩色动画文件多为这种格式的文件。

但GIF有个小小的缺点,即不能存储超过256色的图像。尽管如此,这种格式仍在网络上大行其道应用,这和GIF图像文件短小、下载速度快、可用许多具有同样大小的图像文件组成动画等优势是分不开的。

三、JPEG格式

JPEG也是常见的一种图像格式,它由联合照片专家组(Joint Photographic Experts Group)开发并以命名为"ISO 10918-1",JPEG仅仅是一种俗称而已。JPEG文件的扩展名为.jpg或.jpeg,其压缩技术十分先进,它用有损压缩方式去除冗余的图像和彩色数据,获取得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像质量。

同时JPEG还是一种很灵活的格式,具有调节图像质量的功能,允许你用不同的压缩比例对这种文件压缩,比如我们最高可以把1.37MB的BMP位图文件压缩至20.3KB。当然我们完全可以在图像质量和文件尺寸之间找到平衡点。

由于JPEG优异的品质和杰出的表现,它的应用也非常广泛,特别是在网络和光盘读物上,肯定都能找到它的影子。目前各类浏览器均支持JPEG这种图像格式,因为JPEG格式的文件尺寸较小,下载速度快,使得Web页有可能以较短的下载时间提供大量美观的图像,JPEG同时也就顺理成章地成为网络上最受欢迎的图像格式。

四、JPEG2000格式

JPEG 2000同样是由JPEG 组织负责制定的,它有一个正式名称叫做"ISO 15444",与JPEG相比,它具备更高压缩率以及更多新功能的新一代静态影像压缩技术。

JPEG2000 作为JPEG的升级版,其压缩率比JPEG高约30%左右。与JPEG不同的是,JPEG2000 同时支持有损和无损压缩,而 JPEG 只能支持有损压缩。无损压缩对保存一些重要图片是十分有用的。JPEG2000的一个极其重要的特征在于它能实现渐进传输,这一点与GIF的"渐显"有异曲同工之妙,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图象由朦胧到清晰显示,而不必是像现在的 JPEG 一样,由上到下慢慢显示。

此外,JPEG2000还支持所谓的"感兴趣区域"特性,你可以任意指定影像上你感兴趣区域的压缩质量,还可以选择指定的部份先解压缩。 JPEG 2000 和 JPEG 相比优势明显,且向下兼容,因此取代传统的JPEG格式指日可待。

JPEG2000可应用于传统的JPEG市场,如扫描仪、数码相机等,亦可应用于新兴领域,如网路传输、无线通讯等等。

五、TIFF格式

TIFF(Tag Image File Format)是Mac中广泛使用的图像格式,它由Aldus和微软联合开发,最初是出于跨平台存储扫描图像的需要而设计的。它的特点是图像格式复杂、存贮信息多。正因为它存储的图像细微层次的信息非常多,图像的质量也得以提高,故而非常有利于原稿的复制。

该格式有压缩和非压缩二种形式,其中压缩可采用LZW无损压缩方案存储。不过,由于TIFF格式结构较为复杂,兼容性较差,因此有时你的软件可能不能正确识别TIFF文件(现在绝大部分软件都已解决了这个问题)。目前在Mac和PC机上移植TIFF文件也十分便捷,因而TIFF现在也是微机上使用最广泛的图像文件格式之一。

六、PSD格式

这是著名的Adobe公司的图像处理软件Photoshop的专用格式Photoshop Document(PSD)。PSD其实是Photoshop进行平面设计的一张"草稿图",它里面包含有各种图层、通道、遮罩等多种设计的样稿,以便于下次打开文件时可以修改上一次的设计。在Photoshop所支持的各种图像格式中,PSD的存取速度比其它格式快很多,功能也很强大。由于Photoshop越来越被广泛地应用,所以我们有理由相信,这种格式也会逐步流行起来。

七、PNG格式

PNG(Portable Network Graphics)是一种新兴的网络图像格式。在1994年底,由于Unysis公司宣布GIF拥有专利的压缩方法,要求开发GIF软件的作者须缴交一定费用,由此促使免费的png图像格式的诞生。PNG一开始便结合GIF及JPG两家之长,打算一举取代这两种格式。1996年10月1日由PNG向国际网络联盟提出并得到推荐认可标准,并且大部分绘图软件和浏览器开始支持PNG图像浏览,从此PNG图像格式生机焕发。

PNG是目前保证最不失真的格式,它汲取了GIF和JPG二者的优点,存贮形式丰富,兼有GIF和JPG的色彩模式;它的另一个特点能把图像文件压缩到极限以利于网络传输,但又能保留所有与图像品质有关的信息,因为PNG是采用无损压缩方式来减少文件的大小,这一点与牺牲图像品质以换取高压缩率的JPG有所不同;它的第三个特点是显示速度很快,只需下载1/64的图像信息就可以显示出低分辨率的预览图像;第四,PNG同样支持透明图像的制作,透明图像在制作网页图像的时候很有用,我们可以把图象背景设为透明,用网页本身的颜色信息来代替设为透明的色彩,这样可让图像和网页背景很和谐地融合在一起。

PNG的缺点是不支持动画应用效果,如果在这方面能有所加强,简直就可以完全替代GIF和JPEG了。Macromedia公司的Fireworks软件的默认格式就是PNG。现在,越来越多的软件开始支持这一格式,而且在网络上也越来截止流行。

八、SWF格式

利用Flash我们可以制作出一种后缀名为SWF(Shockwave Format)的动画,这种格式的动画图像能够用比较小的体积来表现丰富的多媒体形式。在图像的传输方面,不必等到文件全部下载才能观看,而是可以边下载边看,因此特别适合网络传输,特别是在传输速率不佳的情况下,也能取得较好的效果。事实也证明了这一点,SWF如今已被大量应用于WEB网页进行多媒体演示与交互性设计。此外,SWF动画是其于矢量技术制作的,因此不管将画面放大多少倍,画面不会因此而有任何损害。综上,SWF格式作品以其高清晰度的画质和小巧的体积,受到了越来越多网页设计者的青睐,也越来越成为网页动画和网页图片设计制作的主流,目前已成为网上动画的事实标准。

九、SVG格式

SVG可以算是目前最最火热的图像文件格式了,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有互交功能,并可以随时插入到HTML中通过浏览器来观看。

它提供了目前网络流行格式GIF和JPEG无法具备了优势:可以任意放大图形显示,但绝不会以牺牲图像质量为代价;字在SVG图像中保留可编辑和可搜寻的状态;平均来讲,SVG文件比JPEG和GIF格式的文件要小很多,因而下载也很快。可以相信,SVG的开发将会为Web提供新的图像标准。

其它非主流图像格式:

1、PCX格式

PCX格式是ZSOFT公司在开发图像处理软件Paintbrush时开发的一种格式,这是一种经过压缩的格式,占用磁盘空间较少。由于该格式出现的时间较长,并且具有压缩及全彩色的能力,所以现在仍比较流行。

2、DXF格式

DXF(Autodesk Drawing Exchange Format)是AutoCAD中的矢量文件格式,它以ASCII码方式存储文件,在表现图形的大小方面十分精确。许多软件都支持DXF格式的输入与输出。

3、WMF格式

WMF(Windows Metafile Format)是Windows中常见的一种图元文件格式,属于矢量文件格式。它具有文件短小、图案造型化的特点,整个图形常由各个独立的组成部分拼接而成,其图形往往较粗糙。

4、EMF格式

EMF(Enhanced Metafile)是微软公司为了弥补使用WMF的不足而开发的一种Windows 32位扩展图元文件格式,也属于矢量文件格式,其目的是欲使图元文件更加容易接受

5、LIC(FLI/FLC)格式

Flic格式由Autodesk公司研制而成,FLIC是FLC和FLI的统称:FLI是最初的基于320×200分辨率的动画文件格式,而FLC则采用了更高效的数据压缩技术,所以具有比FLI更高的压缩比,其分辨率也有了不少提高。

6、EPS格式

EPS(Encapsulated PostScript)是PC机用户较少见的一种格式,而苹果Mac机的用户则用得较多。它是用PostScript语言描述的一种ASCII码文件格式,主要用于排版、打印等输出工作。

7、TGA格式

TGA(Tagged Graphics)文件是由美国Truevision公司为其显示卡开发的一种图像文件格式,已被国际上的图形、图像工业所接受。TGA的结构比较简单,属于一种图形、图像数据的通用格式,在多媒体领域有着很大影响,是计算机生成图像向电视转换的一种首选格式。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式