현재 모션 검색 게임용 웹캠에서 프레임을 변경하는 방법을 알아 내려고하고 있습니다. 나는 Objective-C에 매우 익숙하며, 이것을하기위한 간단한 방법을 찾을 수 없었다. 생성 된 오류 메시지가 말한다NSRect 프레임이 잘못된 식별자 = [자체 프레임]
- (void)captureOutput:(QTCaptureOutput *)captureOutput
didOutputVideoFrame:(CVImageBufferRef)videoFrame
withSampleBuffer:(QTSampleBuffer *)sampleBuffer
fromConnection:(QTCaptureConnection *)connection
{
CIContext *myCIContext;
const NSOpenGLPixelFormatAttribute attr[] = {
NSOpenGLPFAAccelerated,
NSOpenGLPFANoRecovery,
NSOpenGLPFAColorSize, 32,
0
};
NSOpenGLPixelFormat *pf = [[NSOpenGLPixelFormat alloc] initWithAttributes:(void *)&attr];
myCIContext = [CIContext contextWithCGLContext: CGLGetCurrentContext()
pixelFormat: [pf CGLPixelFormatObj]
options: nil];
CVImageBufferRef releasedImageBuffer;
CVBufferRetain(videoFrame);
CIImage *picture = [CIImage imageWithCVImageBuffer:releasedImageBuffer];
NSRect frame = [self frame];
CGRect imageRect;
imageRect = [picture extent];
[colorCorrectionFilter setValue:picture forKey:@"inputImage"];
[effectFilter setValue:[colorCorrectionFilter valueForKey:@"outputImage"] forKey:@"inputImage"];
// render our resulting image into our context
[ciContext drawImage:[compositeFilter valueForKey:@"outputImage"]
atPoint:CGPointMake((int)((frame.size.width - imageRect.size.width) * 0.5), (int)((frame.size.height - imageRect.size.height) * 0.5)) // use integer coordinates to avoid interpolation
fromRect:imageRect];
@synchronized(self)
{
//basically, have frame to be released refer to the current frame
//then update the reference to the current frame with the next frame in the "video stream"
releasedImageBuffer = mCurrentImageBuffer;
mCurrentImageBuffer = videoFrame;
}
CVBufferRelease(releasedImageBuffer);
}
: 여기
내 질문은이 방법에 관한 오류 메시지에 관한
warning: 'MyRecorderController' may not respond to '-frame'
error: invalid initializer
및 라인은
NSRect frame = [self frame];
입니다 강조된 내 헤더는 현재 다음과 같습니다.
#import <QuickTime/ImageCompression.h>
#import <QuickTime/QuickTime.h>
#import <Cocoa/Cocoa.h>
#import <QTKit/QTKit.h>
#import <OpenGL/OpenGL.h>
#import <QuartzCore/QuartzCore.h>
#import <CoreVideo/CoreVideo.h>
@interface MyRecorderController : NSObject{
IBOutlet QTCaptureView *mCaptureView;
IBOutlet NSPopUpButton *videoDevicePopUp;
NSMutableDictionary *namesToDevicesDictionary;
NSString *defaultDeviceMenuTitle;
CVImageBufferRef mCurrentImageBuffer;
QTCaptureDecompressedVideoOutput *mCaptureDecompressedVideoOutput;
// filters for CI rendering
CIFilter *colorCorrectionFilter; // hue saturation brightness control through one CI filter
CIFilter *effectFilter; // zoom blur filter
CIFilter *compositeFilter; // composites the timecode over the video
CIContext *ciContext;
QTCaptureSession *mCaptureSession;
QTCaptureMovieFileOutput *mCaptureMovieFileOutput;
QTCaptureDeviceInput *mCaptureDeviceInput;
}
@end
튜토리얼 코드를 살펴 봤는데 잘못했는지 이해하지 못합니다. 내가 볼 수있는 한 (다양한 샘플 코드로 판단)이 프로토콜을 포함 할 필요는 없습니다. 다른 웹 사이트에서 제안한 것입니다. 그래도 난 그것을 시도하고, 컴파일 않는 동안은 출력 끝 :
2011-01-18 10:19:11.511 MyRecorder[9972:c903] -[MyRecorderController frame]: unrecognized selector sent to instance 0x1001525f0
2011-01-18 10:19:11.512 MyRecorder[9972:c903] *** Ignoring exception: -[MyRecorderController frame]: unrecognized selector sent to instance 0x1001525f0
이 발생했습니다 내가 잘못했던 것도 있습니까? 그렇지 않은 경우 웹캠에서 프레임을 조작하고 화면에 출력 할 수있는 더 좋은 방법이 있습니까?
감사합니다.
NSObject의 '프레임'에 대한 상속을위한 NSView의 메서드가 있어야한다고 생각합니다. 헤더는 NSObject에서 상속되므로 거기에 있어야합니다. X-Code에서 '프레임'메서드를 클릭하면 클래스가 많이 생기고 NSView는 그 중 하나입니다. 구현할 프레임 * 메서드를 정의하지 않은 문제가 여기 있습니까? – Moonlight293
그러나 MyRecorderController는 NSView에서 파생되지 않으므로 NSView의 메서드가있는 이유는 무엇입니까? –
"NSRect frame = [self frame];"이라고 말하면 어떤 프레임을 의미합니까? 답을 아는 사람에게는 해결 방법이 있습니다. :-) – Eiko