C++ 使用openCV从网络摄像头捕获图像的功能仅在第一次调用时有效

C++ 使用openCV从网络摄像头捕获图像的功能仅在第一次调用时有效,c++,opencv,C++,Opencv,嗨,我是OpenCV的新手,实际上一般都是编程的。我正在尝试编写一个函数,每次调用它时都会从我的相机中捕获一幅图像。我编写了这个函数,但它只在第一次调用时起作用。我有点过头了,但现在我上瘾了,必须解决这个问题 int main(int argc, char * argv[]) { int faceCnt = 1; faceCnt = captureFace(faceCnt); cout << faceCnt << endl; if(face

嗨,我是OpenCV的新手,实际上一般都是编程的。我正在尝试编写一个函数,每次调用它时都会从我的相机中捕获一幅图像。我编写了这个函数,但它只在第一次调用时起作用。我有点过头了,但现在我上瘾了,必须解决这个问题

int main(int argc, char * argv[])
{
    int faceCnt = 1;
    faceCnt = captureFace(faceCnt);
    cout << faceCnt << endl;
    if(faceCnt == -1)
             cout << "A problem has occured << endl;
    faceCnt = captureFace(faceCnt);
    cout << faceCnt << endl;
    if(faceCnt == -1)
             cout << "A problem has occured << endl;
    return 0;
}
int captureFace(int cnt){
    Mat temp;
    VideoCapture cap(0);
    if(!cap.isOpened())  //Check to see if capture was successful
            return -1;
    cap >> temp;
    cap.release();
    char numstr[21]; // enough to hold all numbers up to 64-bits
    sprintf(numstr, "%d", cnt);
    string location = "faces/sub";
    string fileType = ".jpg";
    string result = location + numstr + fileType;
    imwrite(result, temp);
    cout << result << endl;
    cnt++;
    if(cap.isOpened())
       return -1;
    return cnt;
}
看看其他一些关于我所犯错误的答案,我发现它们其实并不重要(尽管我不知道我是否相信)。我的相机使用的是Logitech C270,我运行的是xubuntu 13.10


非常感谢你的帮助

我注意到,关闭和打开同一网络摄像头的视频捕获有时会失败。最好打开网络摄像头一次并重新使用

另外,您不一定需要调用release(),这是在VideoCapture的析构函数中或再次调用open()时自动完成的

intmain(intargc,char*argv[])
{
int faceCnt=1;
视频捕获上限(0);
faceCnt=captureFace(faceCnt,cap);

无法在imwrite()之后使用cap.release()@Haris我尝试将cap.release()移动到多个位置,包括imwrite()之后,但都没有效果。可能相机需要一段时间才能再次打开。请尝试在
cap.release()之后添加
sleep(1);
@Mailerdaimon好的,非常有趣的是,sleep函数什么也没做……有没有sleep函数没有区别。无论我传递给它什么,或者在哪里,它都没有更改。我正在运行linux,所以我尝试使用“usleep(),Posix线程,并编写我自己的睡眠函数。这可能意味着什么吗?也许我在做一些完全愚蠢的事情,但它符合要求。@user3034930在linux下它是
usleep(1000*sleepTime)
1000只是在windows使用的单元(秒)和linux使用的单元(毫秒)之间转换。这可能是因为,除了程序中的一个小暂停外,什么也没有改变。错误很可能与初始化时间问题无关。是的,这就成功了!我不知道这个问题,但很高兴知道。谢谢!
HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP
Corrupt JPEG data: 1 extraneous bytes before marker 0xd2
faces/sub1.jpg
2HIGHGUI ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
VIDIOC_STREAMON: Bad file descriptor
Unable to stop the stream.: Bad file descriptor

faces/sub2.jpg
3
int main(int argc, char * argv[])
{
    int faceCnt = 1;
    VideoCapture cap(0);
    faceCnt = captureFace(faceCnt, cap);
    cout << faceCnt << endl;
    if(faceCnt == -1)
             cout << "A problem has occured << endl;
    faceCnt = captureFace(faceCnt, cap);
    cout << faceCnt << endl;
    if(faceCnt == -1)
             cout << "A problem has occured << endl;
    return 0;
}

int captureFace(int cnt, VideoCapture& cap){
    Mat temp;
    if(!cap.isOpened())  //Check to see if capture was successful
            return -1;
    cap >> temp;
    char numstr[21]; // enough to hold all numbers up to 64-bits
    sprintf(numstr, "%d", cnt);
    string location = "faces/sub";
    string fileType = ".jpg";
    string result = location + numstr + fileType;
    imwrite(result, temp);
    cout << result << endl;
    cnt++;
    return cnt;
}