使用OPENCV将图像的裁剪部分提取到单独的图像中 如何用C++提取农作物的不同图像?(我的Opencv版本2.4.10)

使用OPENCV将图像的裁剪部分提取到单独的图像中 如何用C++提取农作物的不同图像?(我的Opencv版本2.4.10),opencv,crop,Opencv,Crop,我已经对轮廓进行了过滤,以匹配所需的车牌宽高比。(第三幅图像-矩形3) 现在,我需要将所有找到的候选字符提取到与“I”候选字符大小相同的“I”独立图像中,这样我就可以分割字符并使用OCR算法 此图像的所需输出为: 两个图像,每个图像包含裁剪版本 (理想情况下,如图所示,使用额外增加的宽度/高度提取) 找到的边界框的 这对我来说是有问题的,如果我需要单独的图像,或者我可以简单地处理整个图像,只包含裁剪的部分(以及所示图像中的黑色背景),以便分割字符 我在这里提供了部分代码: findCo

我已经对轮廓进行了过滤,以匹配所需的车牌宽高比。(第三幅图像-矩形3)

现在,我需要将所有找到的候选字符提取到与“I”候选字符大小相同的“I”独立图像中,这样我就可以分割字符并使用OCR算法

此图像的所需输出为:

两个图像,每个图像包含裁剪版本 (理想情况下,如图所示,使用额外增加的宽度/高度提取) 找到的边界框的

这对我来说是有问题的,如果我需要单独的图像,或者我可以简单地处理整个图像,只包含裁剪的部分(以及所示图像中的黑色背景),以便分割字符

我在这里提供了部分代码:

    findContours(crop, contours, hierarchy, CV_RETR_TREE,
            CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

    vector<Point2f> ContArea(contours.size());

    for (int i = 0; i < contours.size(); i++) {
        approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);
        boundRect[i] = boundingRect(Mat(contours_poly[i]));

    }

    // Draw polygonal contour + filled bonding rects

    Mat drawing4 = Mat::zeros(src_gray.size(), CV_8UC3);

    for (int i = 0; i < contours.size(); i++) {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255),
                rng.uniform(0, 255));

        rectangle(drawing4, boundRect[i].tl(), boundRect[i].br(), color,
                CV_FILLED, 1, 0);

    }

    imshow("Rectangles4", drawing4);

    float ratio;
    Mat drawing3 = Mat::zeros(crop.size(), CV_8UC3);

    // Draw bonding rects

        for (int i = 0; i < contours.size(); i++) {
        Scalar color = Scalar(0, 255, 0);

        double a = contourArea(contours[i]);

        ratio = (float) boundRect[i].width / (float) boundRect[i].height;

        //check for min, max size of area and its ratios

        if ((a > 200 && a < 2600) && ((ratio >= 1.3) && (ratio <= 10))) {
            printf("a: %f ratios: %f", a, ratio);

        //drawContours(drawing3, contours_poly, (int) i, color, 1, 8,
                    vector<Vec4i>(), 0, Point());
       rectangle(drawing3, boundRect[i].tl(), boundRect[i].br(), color,
                        CV_FILLED, 1, 0);
        }
    }

    imshow("Rectangles3", drawing3);
findContours(裁剪、轮廓、层次、CV_RETR_树、,
CV_链_近似_简单,点(0,0));
向量ContArea(contours.size());
对于(int i=0;i如果((a>200&&a<2600)和((比率>=1.3)和((比率),感谢Miki提供答案

裁剪显示在代码的编辑部分

    float ratio;
    int j=0;
    Mat crops[10];
    Mat drawing3 = Mat::zeros(crop.size(), CV_8UC3);

    for (int i = 0; i < contours.size(); i++)
    {
        Scalar color = Scalar(0,255,0);

        double a = contourArea(contours[i]);
           ratio = (float)boundRect[i].width/(float)boundRect[i].height;
                    if ((a > 200 && a < 2600)&&((ratio>=1.3)&&(ratio<=10))){
            printf(" a: %f ratios: %f image%d",a,ratio,i);

            drawContours(drawing3, contours_poly, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point());
            rectangle(drawing3, boundRect[i].tl(), boundRect[i].br(), color,
                            CV_FILLED, 1, 0);

            Mat cropx(src_resized(boundRect[i]));
            crops[j]=cropx;

            imshow("crops",crops[0]);
            if (j==1) imshow("crops1",crops[1]);
            j++;
            waitKey(0);

        }
    }
        imshow("Rectangles3", drawing3);
结果(尚未调整到更大的区域)如下所示:

要放大,只需使用(或类似属性,这需要更多测试)

放大的结果可以在这里看到:

对于每个边界框:
Mat-crapped\u-image\u i(原始图像(bbox))
,或者对于深度复制:
Mat-crapped\u-image\u i=original\u-image(bbox)。clone()
这似乎很好用!非常感谢!唯一的问题是在显示图像时,下一个作物似乎与上一个作物重叠。是因为我这样显示吗?imshow(“作物”,crops)[j] );已测试,仅在imshow中显示图像时重叠。我将添加一个答案。:)
//outside the loop
    int j=0;
            Mat crops[10];


//inside the loop    
    Mat cropx(src_resized(boundRect[i]));
                    crops[j]=cropx;
        j++;
boundRect[i].x=boundRect[i].x -boundRect[i].width/4;
boundRect[i].y=boundRect[i].y -boundRect[i].height/4;
boundRect[i].width=boundRect[i].width +boundRect[i].width/2;
boundRect[i].height=boundRect[i].height +boundRect[i].height/2;