从网络摄像头获取像素颜色

时间:2011-02-10 09:33:09

标签: objective-c macos

我正在尝试从网络摄像头显示的图像中获取像素颜色。我想看看像素颜色是如何随时间变化的。

我目前的解决方案吸收了很多CPU,它可以工作并给我正确答案,但我不是百分百确定我是否正确地做了这个或者我可以减少一些步骤。

- (IBAction)addFrame:(id)sender
{
    // Get the most recent frame
    // This must be done in a @synchronized block because the delegate method that sets the most recent frame is not called on the main thread
    CVImageBufferRef imageBuffer;

    @synchronized (self) {
        imageBuffer = CVBufferRetain(mCurrentImageBuffer);
    }

    if (imageBuffer) {
        // Create an NSImage and add it to the movie
        // I think I can remove some steps here, but not sure where.
        NSCIImageRep *imageRep = [NSCIImageRep imageRepWithCIImage:[CIImage imageWithCVImageBuffer:imageBuffer]];
        NSSize n = {320,160 };
        //NSImage *image = [[[NSImage alloc] initWithSize:[imageRep size]] autorelease];
        NSImage *image = [[[NSImage alloc] initWithSize:n] autorelease];
        [image addRepresentation:imageRep];
        CVBufferRelease(imageBuffer);


        NSBitmapImageRep* raw_img = [NSBitmapImageRep imageRepWithData:[image TIFFRepresentation]];
        NSLog(@"image width is %f", [image size].width);
        NSColor* color = [raw_img colorAtX:1279 y:120];

        float colourValue = [color greenComponent]+ [color redComponent]+ [color blueComponent];
        [graphView setXY:10 andY:200*colourValue/3];

    NSLog(@"%0.3f", colourValue);

感谢任何帮助,我很乐意尝试其他想法。 谢谢你们。

1 个答案:

答案 0 :(得分:1)

有几种方法可以提高效率。请查看this Tech Q&A中的imageFromSampleBuffer:方法,该方法提供了一种从CVImageBufferRef到图像的更简洁方法(示例使用UIImage,但实际上相同对于NSImage)。

您也可以直接从CVImageBufferRef拉出像素值而无需任何转换。一旦你有缓冲区的基地址,你就可以计算任何像素的偏移量,然后从那里读取值。