Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在openCV中使用倾斜的直线获取矩阵(ROI)_Opencv_Roi - Fatal编程技术网

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

如何在openCV中使用倾斜的直线获取矩阵(ROI),opencv,roi,Opencv,Roi,我已经尝试过搜索openCV ROI函数,但是他们都使用了矩形ROI函数 我想使用从hough变换函数得到的倾斜线来获得roi 我的情况是: 我有多条垂直线(小倾斜),它们是从hough变换函数输出的 我想得到垂直线之间的图像(矩阵)。 我想在我的图像中得到分割矩阵(例如,A图像、B图像、C图像等) openCV中是否有使用line的ROI函数? 或 还有其他方法吗?我认为您需要使用轮廓来定义您的roi。如果它不是一个完美的正方形,你就不能使用ROI函数,因为它总是一个完美的正方形(甚至不是一

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

我想使用从hough变换函数得到的倾斜线来获得roi

我的情况是:

我有多条垂直线(小倾斜),它们是从hough变换函数输出的

我想得到垂直线之间的图像(矩阵)。

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

openCV中是否有使用line的ROI函数? 或
还有其他方法吗?

我认为您需要使用轮廓来定义您的roi。如果它不是一个完美的正方形,你就不能使用ROI函数,因为它总是一个完美的正方形(甚至不是一个旋转的正方形)

intmain()
{
枚举hierIdx{H_NEXT=0,H_PREVIOUS,H_FIRST_CHILD,H_PARENT};
cv::Mat img=cv::imread(“example_image.jpg”,cv::imread_UNCHANGED);
//将RGB转换为灰度图像
cv::Mat imgGrs;
cv::CVT颜色(img、imgGrs、cv::颜色为灰色);
//因为它是一个.jpg,所以灰色值被弄乱了
//我们通过将阈值设置为128来修复它
cv::threshold(imgGrs,imgGrs,128255,cv::THRESH_二进制);
imgGrs=~imgGrs;
//现在创建轮廓(我们需要层次结构来查找内部形状)
矢量轮廓;
向量层次;
cv::findContours(imgGrs.clone()、轮廓、层次、cv_RETR_树、cv_链_近似_简单);
//cv::drawContours(img,contours,-1,cv::Scalar(255,0,0),1);
int-iLen=(int)hierarchy.size();
int idxChild=-1;
//找到主人的第一个孩子
对于(int i=0;i=0)
{
//创建图像以用作截面的遮罩
cv::Mat mask=cv::Mat::零(imgGrs.size(),cv_8U);
cv::drawContours(遮罩、轮廓、idxChild、cv::Scalar(255)、cv_填充);
//使遮罩缩小1像素,这样我们就看不到外部轮廓
cv::腐蚀(掩膜、掩膜、元素);
//好的,我们创建一个我们想要的单选零件
cv::Mat零件=imgGrs和面罩;
//将其裁剪为AOI矩形
cv::Rect aoi=cv::boundingRect(等高线[idxChild]);
零件=零件(aoi);
//现在部分是您要求的aoi图像
//转到下一个AOI
idxChild=hierarchy[idxChild][H_NEXT];
}
返回0;
}

您建议如何使用一条直线(或线段)来定义原始图像的矩形子区域(这就是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;
}