Linux 上的 C 程序获取相机照片
C program on Linux to get camera photo
所以我想知道如何从我的 Logitech C270 相机中获取照片?我已经在下面发布了我的代码,似乎相机指向的文件是空的,因为起始地址和结束地址相同。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 307200 // number of pixels (640x480 for my webcam)
int main() {
//create files
FILE *camera, *grab;
camera=fopen("/dev/v4l/by-id/usb-046d_0825_1155F490-video-index0", "rb");
//testing files
if(camera==NULL){fputs("\n Can't open camera!",stderr);}
if(feof(camera)){fputs("\n End of file reached!",stderr);}
if(ferror(camera)){fputs("\n The camera has an error!",stderr);}
//stats
rewind (camera); //set position indicator at begining of file
printf("%p is the pos of pointer start\n",&camera); //starting address
fseek(camera,0,SEEK_END);//set position indicator to EndOfFile
printf("%p is the pos of pointer end\n",&camera); //ending address
//running
grab=fopen("grab.raw", "wb");
float data[SIZE];
int n=2; //arbitrary non 0 num to test if fread = 0
n=fread(data, sizeof(data[0]), SIZE, camera);
if(n=0){perror(ERRNO);}
printf(" %d is the state of fread \n",n); //fread's value
fwrite(data, sizeof(data[0]), SIZE, grab);
fclose(camera);
fclose(grab);
return 0;
}
None 来自//testing 文件的文本出现,我只知道 fread() 是 0,并且我得到的起始地址和结束地址相同。这是什么意思?
谢谢!
您遇到的问题是您检查了 FILE 类型相机在内存中的地址。你应该打印的是fpos(相机)。我不知道你在做什么,但图像可能是一个非位置流,比普通磁盘文件更像一个管道。您还应该检查 rewind 和 fseek 中的 return 代码,看看它们是否无法验证情况。
fread 为 0 的原因是因为在将文件指针定位到 SEEK_END
后无法倒带相机
相机中的文件与您计算机上的文件非常相似。
有一个顶级目录(通常)在其下有两个目录。
任何 video/pictures 都在最底部的目录中。
相机中的文件不是只包含图像的原始二进制文件。
相反,它们是格式化的(图片通常是 .jpg 文件,电影通常是 mpg3 或 mpg4)
上层目录(通常)是单个条目,因此大小将为 0。
如果您使用文件浏览器访问相机,您将看到目录结构。
您的代码需要遵循相机文件结构。
当代码到达实际图像或电影时,它可以检查文件扩展名以确定下一步要做什么。
stat() 将 return 有关文件的详细信息,包括其大小。
stat() 信息 can/should 用于为文件分配足够的内存。
然后可以将文件读入分配的内存中。
所以我想知道如何从我的 Logitech C270 相机中获取照片?我已经在下面发布了我的代码,似乎相机指向的文件是空的,因为起始地址和结束地址相同。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 307200 // number of pixels (640x480 for my webcam)
int main() {
//create files
FILE *camera, *grab;
camera=fopen("/dev/v4l/by-id/usb-046d_0825_1155F490-video-index0", "rb");
//testing files
if(camera==NULL){fputs("\n Can't open camera!",stderr);}
if(feof(camera)){fputs("\n End of file reached!",stderr);}
if(ferror(camera)){fputs("\n The camera has an error!",stderr);}
//stats
rewind (camera); //set position indicator at begining of file
printf("%p is the pos of pointer start\n",&camera); //starting address
fseek(camera,0,SEEK_END);//set position indicator to EndOfFile
printf("%p is the pos of pointer end\n",&camera); //ending address
//running
grab=fopen("grab.raw", "wb");
float data[SIZE];
int n=2; //arbitrary non 0 num to test if fread = 0
n=fread(data, sizeof(data[0]), SIZE, camera);
if(n=0){perror(ERRNO);}
printf(" %d is the state of fread \n",n); //fread's value
fwrite(data, sizeof(data[0]), SIZE, grab);
fclose(camera);
fclose(grab);
return 0;
}
None 来自//testing 文件的文本出现,我只知道 fread() 是 0,并且我得到的起始地址和结束地址相同。这是什么意思? 谢谢!
您遇到的问题是您检查了 FILE 类型相机在内存中的地址。你应该打印的是fpos(相机)。我不知道你在做什么,但图像可能是一个非位置流,比普通磁盘文件更像一个管道。您还应该检查 rewind 和 fseek 中的 return 代码,看看它们是否无法验证情况。 fread 为 0 的原因是因为在将文件指针定位到 SEEK_END
后无法倒带相机相机中的文件与您计算机上的文件非常相似。
有一个顶级目录(通常)在其下有两个目录。
任何 video/pictures 都在最底部的目录中。
相机中的文件不是只包含图像的原始二进制文件。
相反,它们是格式化的(图片通常是 .jpg 文件,电影通常是 mpg3 或 mpg4)
上层目录(通常)是单个条目,因此大小将为 0。
如果您使用文件浏览器访问相机,您将看到目录结构。
您的代码需要遵循相机文件结构。
当代码到达实际图像或电影时,它可以检查文件扩展名以确定下一步要做什么。
stat() 将 return 有关文件的详细信息,包括其大小。
stat() 信息 can/should 用于为文件分配足够的内存。
然后可以将文件读入分配的内存中。