首先感谢文末的分享,感谢!
今天要进行的任务就是角度的结算了,然后就是在上文我们已经得到了内置矩阵和畸变参数了。这样的话我们可以先根据它们矫正x和y的像素值,然后通过计算得到转角。
然后我们直接看看代码吧,也挺复杂的。又是那种结构,但是它的那个是驱动啊,我也没有呀,那我的不就简单了嘛,哈哈,那我还是找个图片试试,然后我将他的代码做了改变,这里还是先看main函数,
这里用到了这个东西:FileStorage 这个也是opencv里面的我也是第一次看见。
OpenCV 中的 FileStorage
类能够读写硬盘中的.xml
和.yaml
文件,这里我们只讨论对 .xml
的以下几种操作:
- 写入(
FileStorage::WRITE
,覆盖写) - 追加(
FileStorage::APPEND
,追加写) - 读取(
FileStorage::WRITE
)
我们这里就用到了读取但是还是将那两个常用的过一遍吧!
filestorage是用FileNode来储存数据的:然后写入的时候有两种方法,先看代码:
FileStorage fs("data.xml", FileStorage::WRITE);
fs <<"map_node"<<"{";
for(size_t i = 0 ;i<10;i++}
{
fs<<"node_"+to_string(i)<<i;
}
fs<<"}";
fs.release();
FileStorage fs("data.xml", FileStorage::WRITE);
fs <<"seq_node"<<"[";
for(size_t i = 0 ;i<10;i++}
{
fs<<i;
}
fs<<"]";
fs.release();
然后这里面的size_t就是unsigned int的意思,第二种更简单,但是不能命名,而第一种可以命名,其实很简单,就是先建个对象,然后给参数,然后给出方法用括号表示开始和结束,然后写入数据
然后读取的话,我们直接我们这里的代码:
FileStorage fs("./1.xml,FileStorage::READ");
fs["camera_matrix"] >> cameraMatrix;
fs["distortion_coefficients"] >> distCoeffs;
这里的话就是我们要有xml文件,在上个文章中,我们只是得到了参数还没有变成xml文件,下面这个博客可以:https://www.cnblogs.com/kekeoutlook/p/13507730.html
img = imread("/home/dji/图片/rm/装甲板1.png");
namedWindow("img");
setMouseCallback("img", on_mouse,&img);
读取图片,然后用滑动条,先建立个回调函数:(现在这里是鼠标点击得到坐标,后期的话就是直接用装甲板识别返回的坐标)
等一下,我的指针真的太差了,看不懂啊,突击一波去。然后就是简单的过了一遍,然后看看这个代码的指针(回调函数)!
这个回调函数也很简单,主要就是有个switch语句,然后对鼠标的三种情况做出反应,然后这里有个calAngle函数才是最重要的哦,这里的一些参数都是cv里的。这个就不多说了。
void on_mouse(int event,int x,int y, int flags,void *ustc)
//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号
{
Mat &img = *(Mat *) ustc;
char temp[16];
switch(event){
case CV_EVENT_LBUTTONDOWN://按下左键
{
cout<<temp<<x<<","<<y<<endl;
putText(img,temp,Point(x,y),FONT_HERSHEY_COMPLEX,0.5,Scalar(0,0,0,255));
drawRect = true;
calAngle