2011-07-01 22 views
0

私はBerkeley_socketsを使ってLinuxにサーバーを持っており、iPodクライアントとのTCP接続を作成します。サーバーからiPodに送信するIplImage* img;があります。私はwrite(socket,/*DATA*/,43200);コマンドを使用し、私が送信しようとしたデータはreinterpret_cast<char*>(img),とimg->imageDataです。これらすべての選択肢は実際にはあらゆる種類のデータを送信します。 iPodの側でサーバーからiPodクライアントにIplImageを送信する方法

私はこの方法データを受信(。私はここにSOで見てきたような複雑なものを気にしない、それだけで一枚の画像からすべてのデータを受信するためです。):

bytesRead = [iStream read: (char*)[buffer mutableBytes] + totalBytesRead maxLength: 43200 - totalBytesRead]; 

は、画像全体を受け取った後、私はこの持っている:今

[buffer setLength: 43200]; 
NSData *imagem = [NSData dataWithBytes:buffer length:43200]; 
UIImage *final= [self UIImageFromIplImage:imagem]; 

を..私は、私は、iPodに取り組んでOpenCVのを持っている可能性が知っている、私はそれが動作するように取得する方法について簡単な説明を見つけることができません、だから私はthe second code from this webpageを使ってそれを適応させました。私は私のイメージのすべての仕様を知っているからです。 CGImageCreate()機能からのすべての変数まで):。

- (UIImage *)UIImageFromIplImage:(NSData *)image { 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

// Allocating the buffer for CGImage 
NSData *data = [NSData dataWithBytes:image length:43200]; 

CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data); 

// Creating CGImage from chunk of IplImage  
size_t width = 240; 
size_t height = 180; 
size_t depth = 8;    //bitsPerComponent 
size_t depthXnChannels = 8; //bitsPerPixel 
size_t widthStep = 240;  //bytesPerRow 

CGImageRef imageRef = CGImageCreate(width, height, depth, depthXnChannels, widthStep, colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,provider, NULL, false, kCGRenderingIntentDefault); 

// Getting UIImage from CGImage 
UIImage *ret = [UIImage imageWithCGImage:imageRef]; 
lolView.image = ret; 
CGImageRelease(imageRef); 
CGDataProviderRelease(provider); 
CGColorSpaceRelease(colorSpace); 
return ret; 

}

問題:私は画像を表示すると、私は送られてきた画像であっても、それは完全に奇妙なと'random'取得いつも同じ。何が間違っているのか分かりません。

PS:TCP接続は、数字や単語などの他のデータとうまく機能しています。画像はグレースケールです。

ありがとうございました。

答えて

1

私はこのように働いています。サーバー側で (openframeworks(& ofxOpenCv)上でLinuxのコード::ブロック):クライアント側で

img.allocate(240, 180, OF_IMAGE_COLOR);     //ofImage 
img2.allocate(240, 180);         //ofxCvColorImage 
frame = cvCreateImage(cvSize(240,180), IPL_DEPTH_8U, 3); //IplImage 
bw = cvCreateImage(cvSize(240,180), IPL_DEPTH_8U, 1);  //IplImage 
gray.allocate(240, 180);         //ofxCvGrayscaleImage 


///ofImage 
img.loadImage("lol.jpg"); 

///ofImage -> ofxCvColor 
img2.setFromPixels(img.getPixels(), 240, 180); 

///ofxCvColor -> IplImage 
frame = img2.getCvImage(); 

///IplImage in GRAY 
cvCvtColor(frame,bw,CV_RGB2GRAY); 
cvThreshold(bw,bw,200,255,CV_THRESH_BINARY); //It is actually a binary image 
gray = bw; 
pix = gray.getPixels(); 

n=write(newsockfd,pix,43200); 

(iPodの4.3):

-(UIImage *) dataFromIplImageToUIImage:(unsigned char *) rawData; 
{ 
size_t width = 240; 
size_t height = 180; 
size_t depth = 8;     //bitsPerComponent 
size_t depthXnChannels = 8;   //bitsPerPixel 
size_t widthStep = 240;    //bytesPerRow 

CGContextRef ctx = CGBitmapContextCreate(rawData, width, height, depth, widthStep, CGColorSpaceCreateDeviceGray(), kCGImageAlphaNone); 

CGImageRef imageRef = CGBitmapContextCreateImage (ctx); 
UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 

CGContextRelease(ctx); 

myImageView.image = rawImage; 
return rawImage; 

free(rawData); 
} 

はおそらく行うための簡単な方法がありますこれは、しかし、ちょっと、仕事が完了します。これが誰にも役立つことを望みます。

関連する問題