Толщина линии в cv Canny

Учу opencv и С++. Проблема в том что на мелких изображений Canny рисует очень токую прерывистую линию, которая тем более имеет ступенчатый вид. Соответственно плохо работает метод по поиску линий cv::HoughLinesP. На крупных изображений такой проблемы нет, а вот на мелких угол наклона изображения отображается не корректно, вот код:

Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

double angle = 0.;

int apertureSize = 5;

std::cout<<"width:" << image.cols << std::endl;
std::cout << "height:" << image.rows << std::endl;
image.copyTo(canny_output);

int thresh = 100;
if(canny_output.cols<100)
    thresh = 40;
if (canny_output.cols > 150) {
    apertureSize = 3;
}



cv::threshold(canny_output, canny_output, 165, 250, 0);


/// Detect edges using canny
Canny(canny_output, canny_output, 220, 400,3,false );


/// Find contours
findContours(canny_output, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE+2);
cv::Mat drawing;
canny_output.copyTo(drawing);
std::cout << "lines size findContur: " << hierarchy.size() << std::endl;

    for (int i = 0; i < contours.size(); i++)
    {
        Vec4i l = hierarchy[i];
        double value;

        double limeL = lenghtLine(hierarchy[i][0], hierarchy[i][1], hierarchy[i][2], hierarchy[i][3]);
        Scalar color = Scalar(255, 255, 255);

        drawContours(canny_output, contours, i, color, 1, 16, hierarchy, 0, Point());


    }

std::vector<cv::Vec4i> linesP;
cv::HoughLinesP(canny_output, linesP, 1, CV_PI/180 , 40,(canny_output.cols /2)-10, 0);

std::cout << "size line in image: " << linesP.size() << std::endl;

int nb_lines = linesP.size();

if (nb_lines == 0) {return 0;}



for (unsigned i = 0; i < nb_lines; i++)
{
    //Vec4i l = linesP[i];
    double value;

    double limeL= lenghtLine(linesP[i][0], linesP[i][1], linesP[i][2], linesP[i][3]);



    angle += value = atan2((double)linesP[i][3] - linesP[i][1], (double)linesP[i][2] - linesP[i][0]);
    std::cout << "angle: " << value * 180 / CV_PI << "     lenght: " << limeL << std::endl;
}
angle /= nb_lines;

std::cout << "Main angle: " << angle * 180 / CV_PI << std::endl;

Метод cv drawConturs улучшил результат,но не сильно. Размытие тоже не помогает(


Ответы (0 шт):