我有一个源图像。我需要从中分割出一个特定的部分并将其另存为另一个图像。我有需要分割的部分的精巧轮廓,但是如何使用它从源图像中剪切出该部分?我附上了源图像和精巧的边缘轮廓。请帮助我并建议我解决方案。
EDIT-1:Alexander Kondratskiy,这就是您所说的填充边界的意思吗?
现在如何将轮廓内外的区域分成两个单独的图像?
编辑 3- 我想到了“与”蒙版和轮廓线源图像。由于我使用的是 C,因此遇到了一些困难。 这是我使用的代码:-
hsv_gray = cvCreateImage( cvSize(seg->width, seg->height), IPL_DEPTH_8U, 1 );
cvCvtColor( seg, hsv_gray, CV_BGR2GRAY );
hsv_mask=cvCloneImage(hsv_gray);
IplImage* contourImg =cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );
IplImage* newImg=cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );
cvAnd(contourImg, hsv_mask,newImg,NULL);
我总是收到大小或类型不匹配的错误。我调整了大小,但似乎无法调整类型,因为一个(hsv_mask)是 1 个 channel ,其他是 3 个 channel 。
@kanat- 我也试过你的 boundingrect,但似乎无法正确使用 C 格式。
最佳答案
在您的第二张图片上使用 cv::findContours
来查找片段的轮廓。然后使用 cv::boundingRect
找到该段的边界框。之后,您可以创建矩阵并将第二张图像的裁剪边界框保存在其中(我认为它是二值图像)。要裁剪所需区域,请使用:
cv::getRectSubPix(your_image, BB_size, cv::Point(BB.x + BB.width/2,
BB.y + BB.height/2), new_image)
.
然后你可以使用 cv::imwrite
保存 new_image
。就是这样。
编辑:
如果您只找到一个轮廓,则使用它(否则您将遍历找到的轮廓的元素)。下面的代码显示了这些步骤,但很抱歉我现在不能测试它:
std::vector<std::vector<cv::Point>> contours;
// cv::findContours(..., contours, ...);
cv::Rect BB = cv::boundingRect(cv::Mat(contours[0]));
cv::Mat new_image;
cv::getRectSubPix(your_image, BB.size(), cv::Point(BB.x + BB.width/2,
BB.y + BB.height/2), new_image);
cv::imwrite("new_image_name.jpg", new_image);
关于c++ - 基于处理所述源图像获得的Canny边缘轮廓在opencv中对源图像进行分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33820358/