Re: How to get pixel information from CIImage of QT frame
Re: How to get pixel information from CIImage of QT frame
- Subject: Re: How to get pixel information from CIImage of QT frame
- From: Ricky Sharp <email@hidden>
- Date: Tue, 15 Jan 2008 20:28:36 -0600
On Jan 15, 2008, at 5:51 PM, JArod Wen wrote:
I am now on a video analysis program. We have get the QT movie and
show it in a OpenGLView using Core Video(mainly based on the source
code of civideoDemo). Now we need to do pixel analysis on the frame
of the movie. I am sure that there is no problem on the video->frame
since we have done some composite filter based on the CIImage frame
we get from the movie.
It is a straight forward idea that we convert each frame into a Core
Image object using
[CIImage imageWithCVImageBuffer:currentFrame]
Here currentFrame is defined by:
CVImageBufferRef currentFrame;
and then our idea is to get the pixel information using
NSBitmapImageRep.
One solution of using [[NSBitmapImageRep alloc] initWithCIImage]
failed when the program run into a Exec_Bad_Access error.
I tried another way: draw the CIImage on to a CIContext and then
render it to bitmap data:
NSData* pixelData = nil;
[ciContextOffScreen render:inputCIImage toBitmap:pixelData
rowBytes:rowBytes bounds:[inputCIImage extent] format:kCIFormatRGBAf
colorSpace:nil];
if(!pixelData)
[ciContext render:inputCIImage toBitmap:pixelData
rowBytes:rowBytes bounds:[inputCIImage extent] format:kCIFormatRGBAf
colorSpace:nil];
return [[NSBitmapImageRep alloc] initWithData:pixelData];
But the problem is finally there is no data in pixelData. So finally
the returned NSBitmapImageRep is empty.
Searching on 'CVImageBufferRef NSImage' turned up a decent amount of
hits including the following link from the QTKit Capture Guide:
<http://developer.apple.com/documentation/QuickTime/Conceptual/QTKitCaptureProgrammingGuide/CreatingStopMotionApplication/chapter_5_section_7.html
>
In the addFrame: block of sample code, they build an image with the
frame buffer data using an NSCIImageRep:
NSCIImageRep *imageRep = [NSCIImageRep imageRepWithCIImage:[CIImage
imageWithCVImageBuffer:imageBuffer]];
NSImage *image = [[[NSImage alloc] initWithSize:[imageRep size]]
autorelease];
Note that there's also other lines around that (to deal with stuff
like calling from a thread other than main), so definitely read the
entire example and see what may apply in your case. No idea on why
you were getting the EXEC_BAD_ACCESS; could be that you were also
calling things from other threads? Could be that it's not possible to
create an NSBitmapImageRep from such a data provider. After all, a
CVImageBufferRef is really an abstract type. Since you mentioned
OpenGL, your CVImageBufferRef is probably really a CVOpenGLBufferRef
You may also want to move this thread to the Quicktime developers list.
___________________________________________________________
Ricky A. Sharp mailto:email@hidden
Instant Interactive(tm) http://www.instantinteractive.com
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden