2008年10月13日月曜日

で,libdecodeqrをいつものことながらQuartz Composerに入れてみる

で,いつものことながらやってみた.
面倒なので今回はコードのみ.(QRDecoderという名前でプロジェクトを起こした.)


#import <Quartz/Quartz.h>
#import <cv.h>
#import <decodeqr.h>
@interface QRDecoderPlugIn : QCPlugIn
{
IplImage *src_img;
int prevW;
int prevH;

}
@property(assign) id<QCPlugInInputImageSource> inputSourceImage;
@property(assign) NSString *outputString;
@end
...
@implementation QRDecoderPlugIn
@dynamic inputSourceImage;
@dynamic outputString;
...
- (id) init
{
if(self = [super init]) {
src_img= nil;
prevW= 0;
prevH= 0;

}
return self;
}
...
- (BOOL) execute:(id<QCPlugInContext>)context atTime:(NSTimeInterval)time withArguments:(NSDictionary*)arguments
{
id<QCPlugInInputImageSource> image= self.inputSourceImage;
if (!image) {
return YES;
}
[image lockBufferRepresentationWithPixelFormat:QCPlugInPixelFormatBGRA8
colorSpace:[image imageColorSpace]
forBounds:[image imageBounds]];
if (src_img==nil
|| prevW!=[image bufferPixelsWide]
|| prevH!=[image bufferPixelsHigh]){
if (src_img!=nil) {
cvReleaseImage(&src_img);
}
src_img= cvCreateImage(cvSize([image bufferPixelsWide], [image bufferPixelsHigh]), IPL_DEPTH_8U, 4);
prevW= [image bufferPixelsWide];
prevH= [image bufferPixelsHigh];
}
src_img->imageData= [image bufferBaseAddress];


//----content--------------------------------------------
{
self.outputString= @"";
QrDecoderHandle decoder= qr_decoder_open();
{
short stat=qr_decoder_decode_image(decoder, src_img, 25, 10);
QrCodeHeader header;
if(qr_decoder_get_header(decoder, &header)){
char *buf= malloc(sizeof(unsigned char) * header.byte_size+1);
qr_decoder_get_body(decoder,(unsigned char *)buf,header.byte_size+1);
//NSLog(@"%s", buf);
self.outputString= [NSString stringWithCString:buf encoding:NSShiftJISStringEncoding];
free(buf);
}
}
qr_decoder_close(decoder);
}
//-----------------------------------------------------

[image unlockBufferRepresentation];
return YES;

}
...
- (void) stopExecution:(id<QCPlugInContext>)context
{
if (src_img!=nil) {
cvReleaseImage(&src_img);
}

}
@end

追加ライブラリは
libcv.dylib, libcxcore.dylib, libdecodeqr.dylib(libdecodeqr.0.9.3.dylib)
である.当然libdecodeqr.dylibは先のエントリーで作ったものだ.
イタリックにしたところはIplImageを使うためのおまじない

で,やるとこうなる.

(画像はlibdecodeqr-0.9.3に入ってた画像のimg/01-4.jpg)


間違いあればご指摘いただきたく,よろしくお願いいたします.

2 件のコメント:

匿名 さんのコメント...

こんにちは!

私もlibdecoderqrを最近使い始めましたが,大体50文字以上の文字列が含まれるQRコードをできないようで困っていますがどうでしょうか?

携帯電話だとうまくデコードできているので,libdecoderqrに問題があるような気がするのですが・・・・.

p_g_ さんのコメント...

匿名さん,コメントありがとうございます.

私は画像処理とか専門でないのでわかりませんが(というより専門ないけど),おそらくは実利用上では前処理が大切なはずなのでそのあたりのノウハウで携帯電話の方はいろいろやってるんじゃないでしょうかね.

今度データを用意してやってみますね.