如何使用OpenCV拉直曲线?

时间:2019-05-24 07:10:19

标签: c++ opencv image-processing

我的图像具有这样的曲线:

enter image description here

我找不到使用OpenCV拉直曲线的技术。它类似于此帖子Straightening a curved contour,但我的问题是特定于使用opencv编码的(在C ++中更好)。

到目前为止,我只能找到曲线的轮廓。

enter image description here

int main()
{
    Mat src; Mat src_gray;
    src = imread("D:/2.jpg");
    cvtColor(src, src_gray, COLOR_BGR2GRAY);
    cv::blur(src_gray, src_gray, Size(1, 15));

    Canny(src_gray, src_gray, 100, 200, 3);
    /// Find contours   
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    RNG rng(12345);
    findContours(src_gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    /// Draw contours
    Mat drawing = Mat::zeros(src_gray.size(), CV_8UC3);
    for (int i = 0; i < contours.size(); i++)
    {
        drawContours(drawing, contours, i, (255), 1, 8, hierarchy, 0, Point());
    }

    imshow("Result window", drawing);
    imwrite("D:/C_Backup_Folder/Ivan_codes/VideoStitcher/result/2_res.jpg", drawing);

    cv::waitKey();
    return 0;
}

但是我不知道如何确定哪条曲线是弯曲的而不是弯曲的,以及如何弄直它。可能吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这是我的建议:

在进行所有操作之前,将图像调整为更大的图像(例如,大5倍)。然后执行您之前的操作,并获得轮廓。找到每个轮廓的最右边的像素,然后调查该轮廓的所有像素并计算每个像素到最右边的像素的水平距离,并对该行(整个行)进行平移。此方法向某些行右移,向其他行左移。

如果您有多个轮廓,请为每一行中的每个轮廓计算此偏移值,并计算其“均值”值,并根据每一行的平均值进行偏移。

最后,调整图像大小。这是我能想到的最简单,最快的方法。