2014-01-06 166 views
1

我的目标是找到使用iPhone摄像头的高尔夫球,所以我在photoshop和 做了同样的步骤我想在openCV上实现图像/实况视频帧 原始图片。OpenCV:图像处理,目标C/C++

  • 则提振satturation让色彩为明亮区域再次
  • 使用曲线切断谱
  • 随后的边缘转换为灰度
  • 使用曲线图像去黑/白
  • 最后 - 只是外观 - 应用颜色

- 输入图片:

enter image description here

--output图片:

enter image description here

你可以帮我或给我的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]; 
    } 

输出图像:

enter image description here

+0

请显示一些代码。 – sgarizvi

+0

我不明白这个问题。你想实现什么?你的图片看起来像一个阈值(用红色代替黑色)。 –

+1

我不理解编辑。你为什么从你的问题中删除了所有的细节? – foundry

回答

2

你不需要OpenCV进行任何现象。你应该能够得到使用核心图片

这个结果看到这个问题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的结果传递给openCV。

+0

感谢@foundry的回复。请在编辑部分查看输出。我已经添加了你建议的代码。 – Vijay

+0

@Vjay - 我在步骤3中添加了建议 - 转换为灰度... – foundry

+0

+1感谢您的回复并提供了链接,我会对此进行调查。 – Vijay