Как отправить IplImage с сервера на iPod-клиент UIImage через TCP
У меня есть сервер в 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 ответ
Я получил это работает, как это. На стороне сервера (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);
}
Возможно, есть более простой способ сделать это, но, эй, выполняет работу. Надеюсь, это кому-нибудь поможет.