【问题标题】:OpenCV crop image with ellipseOpenCV用椭圆裁剪图像
【发布时间】: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

有什么想法吗?

【问题讨论】:

    标签: c++ opencv


    【解决方案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(不是直接循环,但原始教程不存在)

    【讨论】:

      猜你喜欢
      • 2012-06-20
      • 2014-05-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      相关资源
      最近更新 更多