我有VideoSec IP摄像头,以及在嵌入式Linux NPE控制器上运行的守护进程。守护进程需要从IP摄像机中识别图像,该部分采用标准方式的libcurl实现,并且使用轴摄像头工作正常:
static size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written = fwrite(ptr, size, nmemb, stream);
return written;
}
void refreshCameraImage(char *target, char *url)
{
CURL *image;
CURLcode imgresult;
FILE *fp;
image = curl_easy_init();
if (image)
{
fp = fopen(target, "wb");
if(fp == NULL)
printf("\nFile cannot be opened");
curl_easy_setopt(image, CURLOPT_URL, url);
curl_easy_setopt(image, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(image, CURLOPT_WRITEDATA, fp);
imgresult = curl_easy_perform(image);
if( imgresult )
{
printf("\nCannot grab the image!");
}
}
curl_easy_cleanup(image);
fclose(fp);
}
VideoSec相机的问题在于我无法定义任何jpeg流,只能定义MJPEG。 所以,我需要一种方法从libjl中只从mjpeg流中获取一个帧。 OpenCV不是一个选择。
答案 0 :(得分:1)
在M-JPEG中,JPEG图像完整嵌入,并由带有子标题的文本分隔符分隔。因此,提取JPEG是一件容易的事情:
结果数据正好是JPEG文件/图像/流。