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发送图像的主要内容,如果未能解决你的问题,请参考以下文章

OPenCV笔记-Mat转Base64(使用Qt进行转换)

在界面上使用带有 C++ 的 OpenCV 旋转图像

MiniMagick无法编写解码的Base64图像

如何使用 c++ 在带有 opencv 3.0.0 的视频中画一条线

在 iOS 上使用 Phonegap 将图像转换为 Base64 字符串

将带有其他参数的图像的 base64String 快速发布到服务器