gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:02:31 25 4
gpt4 key购买 nike

我在 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上工作,但是我找不到关于如何让它工作的简单解释,所以我使用了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;

问题:当我显示图像时,即使发送的图像始终相同,我也会发现它完全奇怪且“随机”。我真的不知道出了什么问题..

PS:TCP 连接对于其他数据(例如数字或单词)工作正常。并且图像是灰度的。

感谢您的帮助。

最佳答案

我是这样工作的。在服务器端(使用 openframeworks (& ofxOpenCv) 的 linux 中的代码::blocks):

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

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

关于ios - 如何通过 TCP 将 IplImage 从服务器发送到 iPod 客户端 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6546701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com