【问题标题】:OpenCV:image processing,objective C/C++OpenCV:图像处理,目标 C/C++
【发布时间】:2014-01-08 06:15:10
【问题描述】:

我的目标是使用 iPhone 相机找到高尔夫球,所以我在 Photoshop 中做了同样的步骤 我想在图像/实时视频帧上的 openCV 中实现相同的步骤 从原图开始。

  • 然后提高饱和度以使颜色进入浅色区域
  • 使用曲线切断光谱边缘
  • 然后将图像转换为灰度
  • 再次使用曲线来获得黑/白
  • 最后 - 只是为了外观 - 应用颜色

--输入图像:

--输出图像:

能否请您帮助我或给我一些有关在 iOS 中使用 OpenCV 进行图像处理的提示?

提前致谢!

编辑 我使用了以下代码并得到了以下输出图像,

  - (UIImage*) applyToneCurveToImage:(UIImage*)image
    {
     CIImage* ciImage = [[CIImage alloc] initWithImage:image];
     CIFilter*   filter =
     [CIFilter filterWithName:@"CIToneCurve"
               keysAndValues:
     kCIInputImageKey, ciImage,
     @"inputPoint0",[CIVector vectorWithX:0.00 Y:0.3]
     ,@"inputPoint1",[CIVector vectorWithX:0.25 Y:0.4]
     ,@"inputPoint2",[CIVector vectorWithX:0.50 Y:0.5]
     ,@"inputPoint3",[CIVector vectorWithX:0.75 Y:0.6]
     ,@"inputPoint4",[CIVector vectorWithX:1.00 Y:0.7]
     ,nil];

    //CIFilter* filter2 = [filter copy];

    //step1
    filter = [CIFilter filterWithName:@"CIColorControls"
                        keysAndValues:kCIInputImageKey,
              [filter valueForKey:kCIOutputImageKey], nil];


    [filter setValue:[NSNumber numberWithFloat:0]
              forKey:@"inputBrightness"];
    [filter setValue:[NSNumber numberWithFloat:6]
              forKey:@"inputContrast"];

    CIImage* result = [filter valueForKey:kCIOutputImageKey];
    CIContext *context = [CIContext contextWithOptions:nil];

    CGImageRef cgImage = [context createCGImage:result
                                       fromRect:[result extent]];

    UIImage* filteredImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

    ciImage=nil;
    context=nil;
    cgImage=nil;
    result=nil;

    return filteredImage;
   }

    - (void)didCaptureIplImage:(IplImage *)iplImage
    {
    @autoreleasepool
    {
        IplImage *orgimage = cvCreateImage(cvGetSize(iplImage), IPL_DEPTH_8U, 3);

        orgimage=[self CreateIplImageFromUIImage:[self applyToneCurveToImage:[UIImage imageNamed:@"GolfImage.jpeg"] ] ];

        Mat matRGB = Mat(orgimage);

        //ipl imaeg is also converted to HSV; hue is used to find certain color
        IplImage *imgHSV = cvCreateImage(cvGetSize(orgimage), 8, 3);       //2

        cvCvtColor(orgimage, imgHSV, CV_BGR2HSV);

        IplImage *imgThreshed = cvCreateImage(cvGetSize(orgimage), 8, 1);     //3

    //    cvInRangeS(imgHSV, cvScalar(_Hmin, _Smin, _Vmin), cvScalar(_Hmax , _Smax, _Vmax), imgThreshed);

        cvInRangeS(imgHSV, cvScalar(0.00, 0.00, 34.82), cvScalar(180.00 , 202.54, 256.00), imgThreshed);

        Originalimage=nil;

         cvReleaseImage(&iplImage);
         cvReleaseImage(&orgimage);
         cvReleaseImage(&imgHSV);

         [self didFinishProcessingImage:imgThreshed];
    }

输出图像:

【问题讨论】:

  • 请出示一些代码。
  • 我不明白这个问题。你想达到什么目标?您的图片看起来像一个门槛(黑色替换为红色)。
  • 我不懂编辑。为什么你从你的问题中删除了所有的细节?。

标签: ios opencv


【解决方案1】:

你不需要 openCV 来做这些。您应该能够使用 Core Image 获得此结果

看到这个问题How to change minimum or maximum value by CIFilter in Core image?

我在这里对色调曲线的操作给出了相当详细的答案。

这将涵盖您的第 2 步和第 4 步。对于第 1 步(饱和),请尝试CIColorControls。对于第 3 步(转换为灰度),您也可以使用 CIColorControls,但这会涉及将饱和度降至 0,而不是您想要的。相反,您可以使用CIMaximumComponentCIMinimumComponent。对于第 5 步,您可以使用 1-4 的结果作为具有纯色的蒙版。

OpenCV 将允许您从图像的其余部分中挑选出球(我想这是您想要实现的目标,您在问题中没有提到它)。你可以参考这个问题: How does the HoughCircle function works? I can't get it to work properly 我用随附的演示项目回答:https://github.com/foundry/OpenCVCircles。您可以通过从 UIImage 转换为 openCV Mat 格式将核心图像处理的结果传递给 openCV(该链接项目向您展示了如何执行此操作)。

【讨论】:

  • 感谢@foundry 的回复。请检查编辑部分的输出。我已经添加了您建议的代码。
  • +1 感谢您的回复并提供链接,我将对此进行调查。
猜你喜欢
  • 2011-01-17
  • 2012-07-20
  • 2015-07-26
  • 2022-06-22
  • 2010-12-23
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多