对自主标定的实现

简介: //重新整理的比较清楚的opencv框架 #include "stdafx.h"   #include #include #include   using namespace std; using namespace cv;       int _tmain(int a...

//重新整理的比较清楚的opencv框架

#include "stdafx.h"

 

#include <cv.h>

#include <highgui.h>

#include <iostream>

 

using namespace std;

using namespace cv;

 

 

 

int _tmain(int argc, _TCHAR* argv[])

{      

         Mat lastWarpMatrix;Mat warpMatrix;

         //读取数据

         for (int i =2;i<=13;i++)//执行全部文件的遍历

         {

         char strimg[50];

    sprintf(strimg,"image_%d.jpg",i);

         cv::Mat src= cv::imread(strimg,0);

         if (!src.data)

                   return 0;  

   // pyrDown(src,src);

         Mat edge;Mat edgesobel;Mat edgetresh;

    vector<std::vector<cv::Point>>contours;

         threshold(src,edgetresh,22,255,cv::THRESH_BINARY);

    imshow("edgetresh",edgetresh);

         findContours(edgetresh,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);

         Mat result(src.size(),CV_8U,Scalar(255));

         src.copyTo(result);

         //寻找最大contours

         int cmax = 0;

         vector<vector<Point>>::const_iterator itc = contours.begin();

             //在这种循环下面,最后一个就是最大的数据

                   while(itc!=contours.end())

                   {

                            if (itc->size()>cmax)

                            {

                                     cmax = itc->size();

                                     ++itc;

                            }

                            else

                            {

                                     itc = contours.erase(itc);

                            }

                   }

         if (contours.size() <= 0)//如果没有数据

         {

                   return 0;//error

         }

    drawContours(result,contours,-1,Scalar(255),1);

         //获得最大外边距的点序列

         std::vector<cv::Point> thiscount = contours[contours.size()-1];

         Point lt =thiscount[0];Point ltEX  =thiscount[0];//前面为原始,后面为修正

         Point rt =thiscount[0];Point rtEX  =thiscount[0];

         Point ld =thiscount[0];Point ldEX  =thiscount[0];

         Point rd =thiscount[0];Point rdEX  =thiscount[0];

   for (int i = 0;i<thiscount.size();i++)

   {

            Point thispoint =thiscount[i];

            //左上角,往往这个点也就是第一个点

          if (thispoint.x<lt.x & thispoint.y<lt.y )

          {

                    lt = thispoint;

          }

            //右上角

         else if (thispoint.x>=rt.x & thispoint.y<5)

          {

                    rt = thispoint;

          }

           //右下角 这里就是找最大的

           else if (thispoint.x>rd.x /*& thispoint.y>100*/)

           {

                     rd = thispoint;

           }//左下角 这里就是找最小的

           else if (thispoint.x<ld.x/* && thispoint.y >100*/)

           {

                     ld = thispoint;

           }

          

   }

 

                   if ((ld.y == lt.y)|(rt.y==rd.y) )

                   {

                            printf("err in %d",i);

                   }

                   else

                   {

                            //修正,根据直线的斜率

                            ltEX.y = 0;rt.y = 0;rdEX.y = result.rows;ldEX.y = result.rows;

                            ltEX.x = (lt.x-ld.x)*lt.y/(ld.y-lt.y)+lt.x;

                            ldEX.x = ld.x-(ld.y-result.rows)*(lt.x-ld.x)/(lt.y-ld.y);

                            rtEX.x = rt.x+(rd.x-rt.x)*rt.y/(rt.y-rd.y)-13;//由于打光问题,进行修正。这样的修正是否可以将接口提取出来

                            rdEX.x = rd.x -(rt.x-rd.x)*(rd.y-result.rows)/(rt.y-rd.y);

                            cv::circle(result,ltEX,10,Scalar(255));

                            cv::circle(result,ldEX,10,Scalar(255));

                            cv::circle(result,rtEX,10,Scalar(255));

                            cv::circle(result,rdEX,10,Scalar(255));

                       

                            printf("ltex %d %d\n",ltEX.x,ltEX.y);

                            printf("rtex %d %d\n",rtEX.x,rtEX.y);

                            printf("ldex %d %d\n",ldEX.x,ldEX.y);

                            printf("rdex %d %d\n",rdEX.x,rdEX.y);

                            if (ldEX.x<0)//问题出现

                            {

                                    //当前错误,尝试lastwarp

                                 if (lastWarpMatrix.rows == 0)

                                 {

                                           return 0 ;//TODO这个问题现在还没有解决。

                                 }

                                 else//存在lastwarp

                                 {

                                           lastWarpMatrix.copyTo(warpMatrix);

                                 }

                            }

                            else

                            {

                                     //warpperspective 透视矫正

                                     Point2f src_vertices[4];

                                     src_vertices[0] = ltEX;

                                     src_vertices[1] = rtEX;

                                     src_vertices[2] = ldEX;

                                     src_vertices[3] = rdEX;

 

                                     Point2f dst_vertices[4]; //边界略微留有黑边

                                     dst_vertices[0] = Point(0+20, 0);

                                     dst_vertices[1] = Point(result.cols-20,0);

                                     dst_vertices[2] = Point(0+20,result.rows);

                                     dst_vertices[3] = Point(result.cols-20,result.rows);

 

                                     warpMatrix = getPerspectiveTransform(src_vertices, dst_vertices);

                                     warpMatrix.copyTo(lastWarpMatrix);

                            }

                            cv::Mat rotated;

                            warpPerspective(src, rotated, warpMatrix, rotated.size(), INTER_LINEAR, BORDER_CONSTANT);

                            //cv::line(result,lt,ld,Scalar(255));cv::line(result,rt,rd,Scalar(255));

                            imshow("result",result);

                            imshow("rotated",rotated);

                            char rstr[50];

                            sprintf(rstr,"adjust%d.jpg",i);

                            imwrite(rstr,rotated);

                   }

          

            cv::waitKey();

         }

         return 0;

}

 

 

 

 

目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
6月前
|
传感器 数据采集 监控
LabVIEW在动态力传感器校准技术的创新应用
LabVIEW在动态力传感器校准技术的创新应用
56 4
|
存储 自动驾驶 安全
基于轨迹优化的自动驾驶汽车跟随自行车模型动力学控制(Matlab代码实现)
基于轨迹优化的自动驾驶汽车跟随自行车模型动力学控制(Matlab代码实现)
113 0
|
传感器 机器学习/深度学习 算法
多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)
多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)
|
机器人
水下机器人双机械手系统动态建模与控制仿真(Matlab代码实现)
水下机器人双机械手系统动态建模与控制仿真(Matlab代码实现)
201 0
|
传感器 机器学习/深度学习 算法
【多传感器融合】基于卡尔曼、无迹卡尔曼、拓展卡尔曼、粒子滤波实现非移动 GPS 干扰器的多传感器融合和位置估计附matlab代码
【多传感器融合】基于卡尔曼、无迹卡尔曼、拓展卡尔曼、粒子滤波实现非移动 GPS 干扰器的多传感器融合和位置估计附matlab代码
|
传感器 机器学习/深度学习 编解码
激光雷达与视觉联合标定综述!(系统介绍/标定板选择/在线离线标定等)
由于2D识别的成功,论文引入了一个大型基准,称为OMNI3D,重新审视了3D目标检测的任务。OMNI3D对现有数据集进行了重新利用和组合,生成了234k张图像,标注了300多万个实例和97个类别。由于相机内参的变化以及场景和目标类型的丰富多样性,这种规模的3D检测具有挑战性。论文提出了一个名为Cube R-CNN的模型,旨在通过统一的方法在摄像机和场景类型之间进行泛化。结果表明,在更大的OMNI3D和现有基准上,Cube R-CNN优于先前的工作。最后,论文证明了OMNI3D是一个强大的3D目标识别数据集,表明它提高了单个数据集的性能,并可以通过预训练加速对新的较小数据集的学习。
激光雷达与视觉联合标定综述!(系统介绍/标定板选择/在线离线标定等)
|
传感器 机器学习/深度学习 编解码
盘一盘!实时自动驾驶车辆定位技术都有哪些?(视觉/Lidar/多传感器数据融合)(下)
与基于激光雷达的定位相比,基于视觉和数据融合的定位技术在提高精度方面的潜力约为2–5倍。基于激光雷达和视觉的定位可以通过提高图像配准方法的效率来降低计算复杂性。与基于激光雷达和视觉的定位相比,基于数据融合的定位可以实现更好的实时性能,因为每个独立传感器不需要开发复杂的算法来实现其最佳定位潜力。V2X技术可以提高定位鲁棒性。最后,讨论了基于定量比较结果的AVs定位的潜在解决方案和未来方向。
盘一盘!实时自动驾驶车辆定位技术都有哪些?(视觉/Lidar/多传感器数据融合)(下)
|
传感器 编解码 运维
盘一盘!实时自动驾驶车辆定位技术都有哪些?(视觉/Lidar/多传感器数据融合)(上)
与基于激光雷达的定位相比,基于视觉和数据融合的定位技术在提高精度方面的潜力约为2–5倍。基于激光雷达和视觉的定位可以通过提高图像配准方法的效率来降低计算复杂性。与基于激光雷达和视觉的定位相比,基于数据融合的定位可以实现更好的实时性能,因为每个独立传感器不需要开发复杂的算法来实现其最佳定位潜力。V2X技术可以提高定位鲁棒性。最后,讨论了基于定量比较结果的AVs定位的潜在解决方案和未来方向。
盘一盘!实时自动驾驶车辆定位技术都有哪些?(视觉/Lidar/多传感器数据融合)(上)
|
传感器 机器学习/深度学习 人工智能
一文尽览 | 全景/鱼眼相机低速自动驾驶的近距离感知(识别+重建+定位+工程化)(上)
本文的工作部分受到了Malik等人在[5]中的工作的启发。这项工作的作者提出,计算机视觉的核心问题是重建、识别和重组,他们称之为计算机视觉的3R。在此,论文建议将计算机视觉的3R扩展并专门化为自动驾驶计算机视觉的4R:重建、识别、重组和重新定位。
一文尽览 | 全景/鱼眼相机低速自动驾驶的近距离感知(识别+重建+定位+工程化)(上)
|
机器学习/深度学习 传感器 存储
一文尽览 | 全景/鱼眼相机低速自动驾驶的近距离感知(识别+重建+定位+工程化)(下)
本文的工作部分受到了Malik等人在[5]中的工作的启发。这项工作的作者提出,计算机视觉的核心问题是重建、识别和重组,他们称之为计算机视觉的3R。在此,论文建议将计算机视觉的3R扩展并专门化为自动驾驶计算机视觉的4R:重建、识别、重组和重新定位。
一文尽览 | 全景/鱼眼相机低速自动驾驶的近距离感知(识别+重建+定位+工程化)(下)
下一篇
无影云桌面