zoukankan      html  css  js  c++  java
  • 对自主标定的实现

    //重新整理的比较清楚的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 ",ltEX.x,ltEX.y);

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

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

                                printf("rdex %d %d ",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;

    }

     

     

     

  • 相关阅读:
    Spider 爬虫
    python 数据分析几个重要点!!!
    python 接口开发<小demo>
    python 运维那些事儿~ <转>
    centos7 Docker 安装 (转)
    centos7+nginx+uwsgi+python3+django
    linux 用户组 文件权限
    Linux 进阶命令(二)转
    centos7 vi命令
    基于UDP协议的socket套接字编程
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/3883589.html
Copyright © 2011-2022 走看看