c++ - 基于处理所述源图像获得的Canny边缘轮廓在opencv中对源图像进行分割

标签 c++ c opencv image-segmentation canny-operator

我有一个源图像。我需要从中分割出一个特定的部分并将其另存为另一个图像。我有需要分割的部分的精巧轮廓,但是如何使用它从源图像中剪切出该部分?我附上了源图像和精巧的边缘轮廓。请帮助我并建议我解决方案。

Source Image

Canny edge

EDIT-1:Alexander Kondratskiy,这就是您所说的填充边界的意思吗? enter image description here

EDIT-2:根据 Kannat 的说法,我已经这样做了 source Image with contour

现在如何将轮廓内外的区域分成两个单独的图像?

编辑 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/

相关文章:

c++ - 在编译时使用 CRC32 算法对字符串进行哈希处理

c++ - std::numeric_limits::quiet_NaN double/float 可以存储一些额外信息吗

c++ - const 迭代器在 C++14 中仍然是邪恶的吗

c - scsi查询命令获取序列号和型号信息

c++ - 难以在 Mac 上执行基本的 OpenCV 示例

python - Python-OpenCv FindContours

c++ - dsym 文件 UUID 与 xx 中的不匹配,Eclipse CDT 中未加载符号表

c - 搜索、const char 数组和指针运算

c - 用fseek定位FILE *的问题

image-processing - 我怎样才能在直方图的基础上找到一个好的图像