OpenCV用椭圆裁剪图像

Posted

技术标签:

【中文标题】OpenCV用椭圆裁剪图像【英文标题】:OpenCV crop image with ellipse 【发布时间】:2011-03-05 22:14:44 【问题描述】:

我有一个大小为92x112 的图像 (cv::Mat) 我想用椭圆包围这个图像中的对象,然后只获取这个像素来创建另一个只包含该对象的图像。

我的意思是,用椭圆裁剪原始图像。 有可能吗?

我正在尝试画一个椭圆,但椭圆没有画完整,这样:

ellipse(escalada, Point(92/2,112/2), Size(92/2*0.95,112/2*0.85), 0.0, 90.0, 0.0, Scalar(255,0,0), 3, 8);

并使用cvSetImageROI 进行了一些测试以裁剪图像,但此方法仅适用于cvRect

有什么想法吗?

【问题讨论】:

【参考方案1】:

我用这个来解决:

imagen = imread(nombre_imagen,0); //read image (grayscale)
//Use old C interface 
IplImage *res,*roi;
IplImage src(imagen);
res = cvCreateImage(Size(imagen.rows,imagen.cols),8,1);
roi = cvCreateImage(Size(imagen.rows,imagen.cols),8,1);
cvZero(roi);
cvEllipse(roi,cvPoint(src.width/2,src.height/2),cvSize(src.width/2*0.85,src.height/2*0.95),0.0,0.0,360.0,CV_RGB(255,255,255),-1,8,0);

cvAnd(&src, &src, res, roi);
cvReleaseImage(&roi);

然后在 res 变量中,我有一个图像,用椭圆显示 ROI,其余部分为黑色。

【讨论】:

filter2D 和 cvZero 是一回事吗?因为在 c++ Mat 对象中我们不能使用 cvAnd。 cvZero 清除数组(OpenCV 的实际文档使用 cvSetZero) filter2D:将图像与内核进行卷积。 对不起,我的意思是 cvAnd 和 filter2D。我找到了我的答案,在 openCV for c++ API 中有 bitwise_and。【参考方案2】:

不直接支持非矩形 ROI。 但是你可以使用掩码 - 见http://docs.opencv.org/doc/tutorials/core/mat-mask-operations/mat-mask-operations.html(不是直接循环,但原始教程不存在)

【讨论】:

以上是关于OpenCV用椭圆裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

Python and OpenCV - 为啥用 OpenCV 处理的裁剪图像仍然可以影响原始图像?

OpenCV:用高斯模糊裁剪图像

opencv-python:如何用边界框坐标裁剪图像[重复]

# OpenCV 例程200篇214. 绘制椭圆的参数详解

OpenCV 例程200篇214. 绘制椭圆的参数详解

OpenCV 函数学习09-图像的裁剪(cv2.selectROI)