无法检测图像的水平线 [英] Cannot detect horizontal lines of an image

查看:109
本文介绍了无法检测图像的水平线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个移动应用程序来绘制统计数据表图像的图形表示(图形和图表)。目前我正在使用OpenCV和c ++编写项目的表检测模块。



我已经应用了adaptiveThreshold和Canny来检测最大的Contour并裁剪掉了表格。 (,此处应使用RETR_EXTERNAL。


  • 然后







    • 使用RETR_EXTERNAL选项再次查找轮廓。使用CV_FILLED选项查看绘制的轮廓。







    参见bounding rect。





    参见旋转的矩形。




    I'm writing a mobile app to plot the graphical representation (graphs and charts) of images of statistical data tables. currently i'm writing the table detection module of the project using OpenCV with c++.

    I have already applied adaptiveThreshold and Canny to detect the largest Contour and cropped out the table. (https://i.imgur.com/clBS3dr.jpg)

    and following is the code i'm using to detect the horizontal and vertical lines: Note: "Crop" is the already cropped table image(Mat)

    cvtColor(crop, crop, CV_RGB2GRAY);
    adaptiveThreshold(crop, crop, 255, CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY, 31, 15); 
        Mat dst1, cdst1;
    Canny(crop, dst1, 50, 200, 3); 
    cvtColor(dst1, cdst1, CV_GRAY2BGR); 
    
    vector<Vec2f> lines;
    // detect lines
    HoughLines(dst1, lines, 1, CV_PI/180, 200, 0, 0 );
    //HoughLinesP(dst1, lines, 1, CV_PI/180, 150, 0, 0);
    
    // draw lines
    for( size_t i = 0; i < lines.size(); i++ )
    {
        float rho = lines[i][0], theta = lines[i][1];
        //if( theta>CV_PI/180*170 || theta<CV_PI/180*10){
            Point pt1, pt2;
            double a = cos(theta), b = sin(theta);
            double x0 = a*rho, y0 = b*rho;
            pt1.x = cvRound(x0 + 1000*(-b));
            pt1.y = cvRound(y0 + 1000*(a));
            pt2.x = cvRound(x0 - 1000*(-b));
            pt2.y = cvRound(y0 - 1000*(a));
            line( cdst1, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
        //}
    }
    namedWindow("detected lines",WINDOW_NORMAL);
    imshow("detected lines", cdst1);
    

    And the result of this code comes out like this : https://i.imgur.com/yDuCqmo.jpg

    What am I going wrong to the Horizontal lines only to reach half of the image?

    解决方案

    if you are trying to extract each cell in the table you can try contour processing,

    • Find contour, here you should use RETR_EXTERNAL.

    • Then draw contour with CV_FILLED, here you will get mask for your table. Notice that here you should get only one contour, and assumes there wont be any noise outside the table. Or if you got multiple contour draw largest as mask.

    • Again Find contour, with RETR_EXTERNAL option. See the drawn contour with CV_FILLED option.

    See bounding rect.

    See rotated rect.

    这篇关于无法检测图像的水平线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆