OpenCV:如何分割图像?

6
我希望将从网络摄像头捕获的图像分成N*N个小方块,以便可以单独处理这些小方块。
1个回答

12

你需要使用 OpenCV 图像结构的 ROI(感兴趣区域)选项。在 C 接口中,你需要一个名为 cvSetImageROI 的函数;在 C++ 中,它将是 cv::Mat 类的 operator()。这里是一个简单的 C++ 示例,用于按照 NxN 块处理图像:

cv::Mat img;
capture >> img;

for (int r = 0; r < img.rows; r += N)
    for (int c = 0; c < img.cols; c += N)
    {
        cv::Mat tile = img(cv::Range(r, min(r + N, img.rows)),
                     cv::Range(c, min(c + N, img.cols)));//no data copying here
        //cv::Mat tileCopy = img(cv::Range(r, min(r + N, img.rows)),
                     //cv::Range(c, min(c + N, img.cols))).clone();//with data copying

        //tile can be smaller than NxN if image size is not a factor of N
        your_function_processTile(tile);
    }

C版本:

IplImage* img;
CvRect roi;
CvSize size;
int r, c;

size = cvGetSize(img);
for (r = 0; r < size.height; r += N)
    for (c = 0; c < size.width; c += N)
    {
        roi.x = c;
        roi.y = r;
        roi.width = (c + N > size.width) ? (size.width - c) : N;
        roi.height = (r + N > size.height) ? (size.height - r) : N;

        cvSetImageROI(img, roi);

        processTile(img);
    }
cvResetImageROI(img);

1
是的,cvSetImageROI 是用于 IplImage 的。 - Andrey Kamaev
如果我有一个IplImage,如何在上述代码中使用cv::Mat? - andre_lamothe
1
cvarrToMat 可以进行转换。 - Andrey Kamaev
我尝试了tile.row(x).col(x);但是不起作用... 实际上,我想在N*N的瓷砖中的区域(0,4)绘制一个黑色的瓷砖。 - andre_lamothe
请注意,ROI()运算符的逆运算似乎不起作用。也就是说,“result(rowRange,colRange)= modifiedTile;”没有任何作用。相反,必须使用“modifiedTile.copyTo(result(rowRange,colRange));”。 - David Doria
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接