OpenCV在带有C++的iOS上使用base64通过HTTP发送图像
Posted
技术标签:
【中文标题】OpenCV在带有C++的iOS上使用base64通过HTTP发送图像【英文标题】:OpenCV sending image over HTTP with base64 on iOS with C++ 【发布时间】:2013-02-28 10:11:04 【问题描述】:我正在 ios 上创建一个应用程序,我在其中发送一个关键点列表(这可行)和一个从OrbDescriptorExtractor
生成的Mat
图像。图像的发送工作,接收到的base64与base64发送相同。所以我的猜测是它在编码和解码上出错了。
左图是编码前的图,右图是服务器接收到的解码后的图:
这是用base64编码Mat
(desc)图像的代码,我使用的base64函数来自this site。
char sendFile[1000];
char temp[100];
std::sprintf(temp, "^^%d^^%d^^", desc.cols, desc.rows);
strcat(sendFile, temp);
const unsigned char* inBuffer = reinterpret_cast<const unsigned char*>(desc.data);
strcat(sendFile, base64_encode(inBuffer, strlen((char*)inBuffer)).c_str());
strcat(sendFile, "\0");
在此之后,文件通过 HTTP Post 保存在服务器上,然后在 php 中使用 exec()
打开 C++ 脚本,这样就可以了。
在此之后,图像以这种方式解码:
int processData(string input, int* width, int* height)
int cur = 0, k = 0;
for(unsigned int i = 0; i < input.length(); i++)
if(input.substr(i, 2) == "^^")
if(cur == 0)
k = i + 2;
else if(cur == 1)
*width = getIntFromString(input, k, i);
k = i + 2;
else
*height = getIntFromString(input, k, i);
break;
cur++;
return 0;
int error, w, h;
string line, data;
ifstream file;
file.open(argv[1]);
if(file.is_open())
error = processData(line, &w, &h);
if(error != 0)
printf("Processing keypoints failed \n");
return 1;
getline(file, line);
data = base64_decode(line);
file.close();
else
printf("Couldn't open file.\n");
return 1;
Mat tex_des(Size(w, h), CV_8UC1, (void*)data.c_str());
如何以正确的方式发送 OpenCV 图像而不丢失数据?
【问题讨论】:
【参考方案1】:您不得对二进制数据使用任何 str... 函数!!
strlen((char*)inBuffer) 在第一个零处停止,给出错误结果
使用 desc.total() 代替缓冲区长度
【讨论】:
非常感谢您的成功!你能解释一下为什么我不能对二进制数据使用 str 函数吗? strlen 遍历数组,直到找到第一个 0。这对于字符串来说很好,但对于二进制信息来说是愚蠢的,比如图像,其中 0 是一个完全合法的黑色像素。看看你的图片,它有很多。 strcat,strcpy,不管他们都遇到同样的问题【参考方案2】:我使用了一种稍微不同的方法。我会写的,希望对你有帮助:
//Consider we have the image saved in UIImage
UIImage * myImage;
//Get the data
NSData imageData = UIImageJPEGRepresentation(myImage, 1.0);
//I am using this extension to encode to base 64 (https://gist.github.com/Abizern/1643491)
//Article from the save author http://www.cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html
NSString *encodedImage = [imageData base64EncodedString];
然后我将encodedImage
发送到服务器。
【讨论】:
但是当它转换为 JPEG 时,它会被压缩。而且因为它是用于计算函数的,我担心它会导致错误。以上是关于OpenCV在带有C++的iOS上使用base64通过HTTP发送图像的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 c++ 在带有 opencv 3.0.0 的视频中画一条线