Как отправить IplImage с сервера на iPod-клиент UIImage через TCP - PullRequest
0 голосов
/ 01 июля 2011

У меня есть сервер в Linux, использующий Berkeley_sockets , и я создаю TCP-соединение с клиентом iPod.У меня есть IplImage* img; для отправки с сервера на iPod.Я использую команду write(socket,/*DATA*/,43200); и данные, которые я пытался отправить: reinterpret_cast<char*>(img), img и img->imageData.Все эти варианты на самом деле отправляют любые данные.

На стороне iPod я получаю данные таким образом (как я видел здесь в 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];

Теперь ... я знаю, что мог бы иметь openCV, работающий на iPod, но я не могу найти простое объяснение того, какчтобы заставить его работать, поэтому я использовал второй код с этой веб-страницы и адаптировал его, так как я знаю все характеристики своего изображения (например, я установил все переменные из функции 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;

} ​​

ПРОБЛЕМА: Когда я отображаю изображение, оно получается совершенно странным и «случайным», даже если отправленное изображение всегдатот же самый.Я действительно понятия не имею, что не так ..

PS: TCP-соединение работает нормально с другими данными, такими как числа или слова.И изображение в градациях серого.

Спасибо за помощь.

1 Ответ

1 голос
/ 04 июля 2011

У меня получилось так.На стороне сервера (code :: blocks в linux с openframeworks (& ofxOpenCv)):

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);
}

Возможно, есть прощеспособ сделать это, но эй, получает работу.Надеюсь, это кому-нибудь поможет.

...