cvCreateImageHeader 后,JPG 图像从 30KB 变为 300KB [英] JPG image goes from 30KB to 300KB after cvCreateImageHeader

查看:96
本文介绍了cvCreateImageHeader 后,JPG 图像从 30KB 变为 300KB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我计划的一部分:

// let's get jpg image from socket
int iRcvdBytes=recvfrom(iSockFd, buff, bufferSize, 0, 
(struct sockaddr*)&cliAddr, (socklen_t*)&cliAddrLen);

// buff now contains 30KB jpg image

// let's load the jpg image to IplImage
IplImage* fIplImageHeader;
fIplImageHeader = cvCreateImageHeader(cvSize(640, 480), 8, 1);
fIplImageHeader->imageData = (char *)buff;

// now let's check the size difference
cout << "Received " << iRcvdBytes << " bytes from the client" << endl;
cout << fIplImageHeader->imageSize << endl;

输出为:

Received 31860 bytes from the client
307200

现在这是为什么?cvCreateImageHeader() 是否在内部将 jpg 图像转换为 RGB 或类似的东西?我希望它保持 JPG 并用 cvShowImage() 显示.

Now why is that? Is cvCreateImageHeader() converting the jpg image to RGB or something like that internally? I want it to stay JPG and show it with cvShowImage().

拜托,欢迎任何帮助.

推荐答案

您正在比较压缩的 jpeg 图像数据与未压缩的像素数据的长度.

You are comparing the lenght of the compressed jpeg image data to the uncompressed pixel data.

特别是,给定:

fIplImageHeader = cvCreateImageHeader(cvSize(width, height), depth, channels) 

fIplImageHeader->imageSize == width * height * (depth/8) * channels

recvfrom() 调用接收到的字节分配给 imageData 区域首先不起作用.

Assigning the bytes recieved by the recvfrom() call to the imageData area doesn't work in the first place.

这篇关于cvCreateImageHeader 后,JPG 图像从 30KB 变为 300KB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆