使用外置摄像头时,一定要设置图片格式,即
VideoCapture invid(0);
invid.set(CV_CAP_PROP_FRAME_WIDTH, 800);
invid.set(CV_CAP_PROP_FRAME_HEIGHT, 600);
否则会出错。
设置鼠标交互,setMouseCallback()前一定要声明窗口名,即namedWindow,否则setMouseCallback找不到窗口。
计算相机内参与畸变向量:
参考书籍:《学习OpenCV》,书中说得很详细。
关于角点查询与绘制,内参与畸变矩阵的获得,参考7.11的程序。
http://bbs.dji.com/thread-22089-1-1.html
argc和argv:
int类型的argc用来统计程序运行时发送给main函数的命令行参数的个数;第二个参数,char* argv[]为字符串数组,用来存放指向字符串参数的指针数组。
argv[0]指向程序运行的全路径名。
argv[1]指向DOS命令行中执行程序名后的第一个字符串。
其他以此类推。
argv[argc]为NULL。
argv[1]对应于“项目属性”->“配置属性”->“调试”->“命令参数”中的值。
比如如果要读入一张图片,写“1.jpg”;如果要读入两张图片,写“1.jpg” “2.jpg”,中间要加空格。
imread():
Mat imread(const string& filename, int flags=1);
第一个参数是我们需要填入的图片路径名。支持大多数常见类型。
第二个参数flags是载入标识,指定加载图像的颜色类型,默认值为1。
-1 原图
0 灰度图
1 转换图像到彩色
2 如果载入的图像深度为16或32位,就返回对应深度的图像,否则就转换为8位图像。
4 最真实无损的源图像。
如果输入1 | 2 这种有冲突的数字,则选择较小的数字。
flags>0 返回一个3通道彩色图像。
flags=0 返回灰度图像。
flags<0 返回包含Alpha通道的加载图像。阿尔法通道(Alpha Channel)是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域,其中黑表示不透明,白表示透明,灰表示半透明。
若以彩色模式载入图像,解码后的图像会以BGR的通道顺序进行存储,即蓝绿红的顺序,而不是通常的RGB顺序。
void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE);
该函数用于创建一个窗口。
第一个参数是窗口名字。
第二个参数是窗口的标识,可以填如下几种值。
WINDOW_NORMAL :设置这个值,用户可以改变窗口大小,基本和改变网页等窗口大小一样。
WINDOW_AUTOSIZE:窗口大小会自动调整以适应所显示的图像。
WINDOW_OPENGL:窗口创建的时候会支持OpenGL。
若是只想展示图片,则可以略去该函数调用;若是在显示窗口之前就用到某个窗口名(比如创建滑动条或者进行鼠标交互),则需要用namedWindow先创建窗口并指定名字。
imwrite():
输出图像到文件。
bool imwrite(const string& filename, InputArray)
串口通信
1 #using <System.dll>
2
3 using namespace System;
4 using namespace System::IO::Ports;
5 using namespace System::Threading;
6
7 int main()
8 {
9 //初始化串口,(串口名,波特率,奇偶校验位,数据位,停止位)
10 SerialPort^ mySerialPort = gcnew SerialPort("COM5",128000,Parity::None,8,StopBits::One);
11 //打开串口
12 mySerialPort->Open();
13
14 mySerialPort->WriteLine("要写入串口的数据");
15 //关闭串口
16 mySerialPort->Close();
17 }
有关FileStorage类的研究
OpenCV通过XML/YAML格式实现数据持久化。
XML即eXtensible Markup Language,可扩展标识语言。XML是元标记语言,开发者可以根据自身需要定义自己的标记,比如<book><name>。
YAML即“YAML Ain't a Markup Language”的简写。虽然仍是置标语言,但它以数据为中心。
写入或者读取数据到XML或YAML文件的操作流程:
(1)实例化一个FileStorage类对象,用默认带参数的构造函数完成初始化,或者用FileStorage::open()成员函数辅助初始化。
(2)使用流操作符<<进行文件写入操作,或者>>进行文件读取。
(3)使用FileStorage::release()函数析构FileStorage类对象,同时关闭文件。
1.XML/YAML文件的构造:
FileStorage(const string& source, int flags, const string& encoding=string());
string的几种情况:
FileStorage::READ 打开文件进行读操作
FileStorage::WRITE 打开文件进行写操作
FileStorage::APPEND打开文件进行附加操作
FileStorage::MEMORY 从source读数据,或向内部缓存写入数据
(1)准备文件写操作(两种方式)
①FileStorage fs("camera.xml",FileStorage::WRITE);
②FileStorage fs;
fs.open("camera.xml",FileStorage::WRITE);
(2)准备文件读操作(两种方式)
①FileStorage fs("camera.xml",FileStorage::READ);
②FileStorage fs;
fs.open("camera.xml",FileStorage::READ);
2.进行文件读写操作
(1)文本和数字的输入和输出
定义好FileStorage类对象之后,写入文件可以使用"<<"运算符:
fs << "helicopter" << 100;
读取文件:
int hp;
fs["helicopter"] >> hp;
个人感觉读写中,文本像是另类的变量名一样,或者说是数据的地址吧。
(2)OpenCV数据结构的输入和输出
先初始化,再进行读写。
到这里的话就够用了。
initUndistortRectifyMap()函数:
这个函数似乎用来计算
CV_EXPORTS_W void initUndistortRectifyMap( InputArray cameraMatrix, InputArray distCoeffs,
InputArray R, InputArray newCameraMatrix,
Size size, int m1type, OutputArray map1, OutputArray map2 );
cameraMatrix——输入的摄像机内参数矩阵
distCoeffs——输入的摄像机畸变系数矩阵
R——输入的第一和第二相机坐标系之间的旋转矩阵
newCameraMatrix——输入的校正后的3X3摄像机矩阵(也可用 cvStereoRectify()得出的3X4的左或右投影矩阵,其实系统会自动提取该矩阵前三列的有用部分作为输入参数)
size——摄像机采集的无失真图像尺寸
m1type——map1的数据类型,可以是CV_32FC1或CV_16SC2
map1——输出的X坐标重映射参数
map2——输出的Y坐标重映射参数
摄像头操作的函数
https://blog.csdn.net/hgz_gs/article/details/50733143
remap( InputArray src,// 输入图像
OutputArray dst,// 输出图像
InputArray map1,InputArray map2,
int interpolation,// 选择的插值方法,最近邻插值,双线性插值(线性),双三次样条插值等
int borderMode,// 边界模式,表示目标图像中“离群点”的像素值不会被此函数修改
const Scalar& borderValue=Scalar()) //有常数边界时使用的值
map1有两种表示对象:①表示点(x,y)的第一个映射。 ②表示某种类型变量的X值。
map2同样有两种表示对象:①map1表示(x,y)时,这个参数不表示任何值。 ②表示某种类型变量的Y值。
bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1
gemm( InputArray matA, InputArray matB, double alpha,
InputArray matC, double beta, OutputArray _matD, int flags )
矩阵乘法:
D=alpha*A^T*B+beta*C^T