Last active
May 26, 2020 05:17
-
-
Save yiling-chen/6129189 to your computer and use it in GitHub Desktop.
Use libcurl to get a remote image file and render by OpenCV.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//================================================================================== | |
// Description : Use libcurl to get a remote image file and render by OpenCV | |
// Based on the example from http://curl.haxx.se/libcurl/c/getinmemory.html | |
//================================================================================== | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <curl/curl.h> | |
#include <opencv2/opencv.hpp> | |
using namespace cv; | |
struct MemoryStruct { | |
char *memory; | |
size_t size; | |
}; | |
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, | |
void *userp) { | |
size_t realsize = size * nmemb; | |
struct MemoryStruct *mem = (struct MemoryStruct *) userp; | |
mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1); | |
if (mem->memory == NULL) { | |
/* out of memory! */ | |
printf("not enough memory (realloc returned NULL)\n"); | |
return 0; | |
} | |
memcpy(&(mem->memory[mem->size]), contents, realsize); | |
mem->size += realsize; | |
mem->memory[mem->size] = 0; | |
return realsize; | |
} | |
int main(int argc, char *argv[]) { | |
CURL *curl_handle; | |
CURLcode res; | |
struct MemoryStruct chunk; | |
chunk.memory = (char*)malloc(1); /* will be grown as needed by the realloc above */ | |
chunk.size = 0; /* no data at this point */ | |
curl_global_init(CURL_GLOBAL_ALL); | |
/* init the curl session */ | |
curl_handle = curl_easy_init(); | |
/* specify URL to get | |
* Note: be sure to make the following URL link to a valid image file | |
*/ | |
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://xxxxxxxxxxxxxxx/xxx.jpg"); | |
/* send all data to this function */ | |
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); | |
/* we pass our 'chunk' struct to the callback function */ | |
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void * )&chunk); | |
/* some servers don't like requests that are made without a user-agent | |
field, so we provide one */ | |
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); | |
/* get it! */ | |
res = curl_easy_perform(curl_handle); | |
/* check for errors */ | |
if (res != CURLE_OK) { | |
fprintf(stderr, "curl_easy_perform() failed: %s\n", | |
curl_easy_strerror(res)); | |
} else { | |
/* | |
* Now, our chunk.memory points to a memory block that is chunk.size | |
* bytes big and contains the remote file. | |
* | |
* Do something nice with it! | |
* | |
* You should be aware of the fact that at this point we might have an | |
* allocated data block, and nothing has yet deallocated that data. So when | |
* you're done with it, you should free() it as a nice application. | |
*/ | |
printf("%lu bytes retrieved\n", (long) chunk.size); | |
Mat image; | |
image = imdecode(Mat(1, chunk.size, CV_8UC3, chunk.memory), CV_LOAD_IMAGE_UNCHANGED); | |
namedWindow("Image", CV_WINDOW_AUTOSIZE); | |
if (!image.empty()) { | |
imshow("Image", image); | |
waitKey(); | |
} | |
} | |
/* cleanup curl stuff */ | |
curl_easy_cleanup(curl_handle); | |
if (chunk.memory) { | |
free(chunk.memory); | |
} | |
/* we're done with libcurl, so clean it up */ | |
curl_global_cleanup(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment