gpt4 book ai didi

c++ - 使用 OpenCV,尝试提取 ArrayOfArrays 描述的图片区域

转载 作者:可可西里 更新时间:2023-11-01 15:38:00 28 4
gpt4 key购买 nike

我正在 iOS 中开发一些图像处理工具。目前,我计算了一个特征轮廓,其类型为 InputArrayOfArrays。

声明为:

std::vector<std::vector<cv::Point> > contours_final( temp_contours.size() );

现在,我想提取原始RGB图片中轮廓圈出的区域,并可能进一步将子图像存储为cv::Mat格式。我该怎么做?

提前致谢!

最佳答案

我猜你想做的只是提取检测到的轮廓中的区域。这是一个可能的解决方案:

using namespace cv;

int main(void)
{
vector<Mat> subregions;
// contours_final is as given above in your code
for (int i = 0; i < contours_final.size(); i++)
{
// Get bounding box for contour
Rect roi = boundingRect(contours_final[i]); // This is a OpenCV function

// Create a mask for each contour to mask out that region from image.
Mat mask = Mat::zeros(image.size(), CV_8UC1);
drawContours(mask, contours_final, i, Scalar(255), CV_FILLED); // This is a OpenCV function

// At this point, mask has value of 255 for pixels within the contour and value of 0 for those not in contour.

// Extract region using mask for region
Mat contourRegion;
Mat imageROI;
image.copyTo(imageROI, mask); // 'image' is the image you used to compute the contours.
contourRegion = imageROI(roi);
// Mat maskROI = mask(roi); // Save this if you want a mask for pixels within the contour in contourRegion.

// Store contourRegion. contourRegion is a rectangular image the size of the bounding rect for the contour
// BUT only pixels within the contour is visible. All other pixels are set to (0,0,0).
subregions.push_back(contourRegion);
}

return 0;
}

如果您想以支持透明的格式(例如 png)保存子区域,您可能还需要考虑保存单个蒙版以选择性地用作 alpha channel 。

注意:我没有为每个轮廓提取边界框中的所有像素,只是提取轮廓内的像素。不在轮廓内但在边界框中的像素设置为 0。原因是您的 Mat 对象是一个数组,这使它成为矩形。

最后,我看不出有任何理由让您将轮廓中的像素保存在专门创建的数据结构中,因为您需要存储每个像素的位置才能重新创建图像。如果您关心的是节省空间,那根本不会为您节省太多空间。保存最紧密的边界框就足够了。相反,如果您只想分析轮廓区域中的像素,请为每个轮廓保存一份掩码拷贝,以便您可以使用它来检查轮廓内的像素。

关于c++ - 使用 OpenCV,尝试提取 ArrayOfArrays 描述的图片区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10176184/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com