如何通过TCP将IplImage从服务器发送到iPod客户端UIImage



我在linux中有一个使用Berkeley_sockets的服务器,我创建了一个与iPod客户端的TCP连接。我有一个IplImage* img;要从服务器发送到iPod。我使用write(socket,/*DATA*/,43200);命令,尝试发送的数据是:reinterpret_cast<char*>(img)imgimg->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连接可以很好地处理其他数据,比如数字或单词。图像是灰度级的。

谢谢你的帮助。

我让它像这样工作。在服务器端(代码::linux中带有openframework(&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);
}

也许有一种更简单的方法可以做到这一点,但是嘿,完成工作。希望这能帮助到任何人。

相关内容

  • 没有找到相关文章