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;

    }

     

     

     

  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 洁净数
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    20. Valid Parentheses
    290. Word Pattern
    205. Isomorphic Strings
    71. Simplify Path
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/3883589.html
Copyright © 2011-2022 走看看