如何使用倾斜的线在openCV中获取矩阵(ROI)

Posted

技术标签:

【中文标题】如何使用倾斜的线在openCV中获取矩阵(ROI)【英文标题】:how to get Matrix(ROI) in openCV using by line that inclined 【发布时间】:2018-04-24 14:37:46 【问题描述】:

我已经尝试搜索过openCV ROI函数,但是他们都使用了矩形roi函数。

我想通过 hough 变换 函数得到的斜线获得 roi。

接下来是我的情况:

我有多条从霍夫变换函数输出的垂直线(有点倾斜)。

我想在垂直线之间获取图像(矩阵)。 enter image description here

我想在我的图像中得到分割矩阵(例如,A 图像、B 图像、C 图像等)

openCV 中是否有使用 line 的 ROI 函数? 或者 还有什么方法吗?

【问题讨论】:

您如何建议使用单条线(或者可能是线段)来定义原始图像的矩形子区域(这就是 ROI 在这里的意思)?预期的结果是什么?请举例说明。 【参考方案1】:

我认为您需要使用轮廓来定义您的投资回报率。如果它不是一个完美的正方形你不能使用 ROI 功能,因为这总是一个完美的正方形(甚至不是一个旋转的正方形)

int main()

    enum hierIdx  H_NEXT = 0, H_PREVIOUS, H_FIRST_CHILD, H_PARENT ;
    cv::Mat img = cv::imread("example_image.jpg", cv::IMREAD_UNCHANGED);
    // convert RGB to gray scale image
    cv::Mat imgGrs;
    cv::cvtColor(img, imgGrs, cv::COLOR_RGB2GRAY);
    // because it was a .jpg the grey values are messed up
    // we fix it by thresholding at 128
    cv::threshold(imgGrs, imgGrs, 128, 255, cv::THRESH_BINARY);
    imgGrs = ~imgGrs;
    // now create contours (we need the hierarchy to find the inner shapes)
    std::vector<std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(imgGrs.clone(), contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
    //cv::drawContours(img, contours, -1, cv::Scalar(255, 0, 0), 1);

    int iLen = (int)hierarchy.size();
    int idxChild = -1;
    // find first child of master
    for (int i = 0; i < iLen; i++)
        if (hierarchy[i][H_PARENT] < 0) 
            idxChild = hierarchy[i][H_FIRST_CHILD];
            break;
        
    

    // used for erosion of mask
    cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3));

    while (idxChild >= 0)
    
        // create image to use as mask for section
        cv::Mat mask = cv::Mat::zeros(imgGrs.size(), CV_8U);
        cv::drawContours(mask, contours, idxChild, cv::Scalar(255), CV_FILLED);
        // make masker 1 pixel smaller so we wont see the outer contours
        cv::erode(mask, mask, element);
        // ok nu we create a singled out part we want
        cv::Mat part = imgGrs & mask;
        // Crop it to the AOI rectangle
        cv::Rect aoi = cv::boundingRect(contours[idxChild]);
        part = part(aoi);
        // part is now the aoi image you asked for

        // proceed to next AOI
        idxChild = hierarchy[idxChild][H_NEXT];
    
    return 0;

【讨论】:

感谢您的回答。但是,没有从轮廓获取图像的功能。只画然后结束

以上是关于如何使用倾斜的线在openCV中获取矩阵(ROI)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 的 HoughLines 以啥顺序列出 [rho,theta] 矩阵中检测到的线?

使用 opencv 进行立体图像校正不起作用

使用Python,OpenCV获取更改像素,修改图像通道,剪裁ROI

如何使用 Python 和 OpenCV 裁剪图像中的多个 ROI

如何使用 dlib 跟踪 ROI 内的对象?

Opencv检测边界和ROI掩码