John 965 John 965 - 3 months ago 35
C++ Question

OpenCV imwrite is not working

I have a simple OpenCV application that takes a video stream from the webcam, and when the

spacebar
is pressed it captures the current image and freezes on that image. When I try to use the
cv::imwrite()
method to save the picture to disk, it does not work. The code successfully compiles but it does not save the image. It is returning a false value as well from the call. I am not sure if this is an issue of type of image or something else, but I seem to be stumped.

Here is the code for my current cpp class:

#include <iostream>

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace std;
using namespace cv;

Mat picture;
char key;

class FacialRec {

};

int main() {
//Starting the video
VideoCapture videoCapture(0);

if (!videoCapture.isOpened()) {
cout << "Unable to open video file." << endl;
return 1;
}

namedWindow("Webcam", CV_WINDOW_AUTOSIZE);

while(true) {
Mat frame;
videoCapture.retrieve(frame);
bool success = videoCapture.read(frame);

if (!success) {
cout << "Could not read from video file" << endl;
return 1;
}

imshow("Webcam", frame);
key = waitKey(30);

if (key == 27) { //escape key pressed: stop program
cout << "ESC pressed. Program closing..." << endl;
break;
}else if (key == ' ') { //spacebar pressed: take a picture
picture = frame;
key = -1;

while (true) {
imshow("Webcam", picture);

key = waitKey(30);

if (key == 27 || key == 32) {
cout << "ESC or SPACE pressed. Returning to video..." << endl;
break;
}

if (key == 115) {
//trying to save to current directory
bool maybe = imwrite("/testimage.jpg", picture);
// maybe bool is always getting value of 0, or false
cout << "s was pressed. saving image " << maybe << endl;
}
}
}

}

return 0;
}

Answer

You are attempting to write testimage.jpg to the / directory. The executing program probably doesn't have sufficient permissions to write to that directory. Based on your comment, you probably want

//trying to save to current directory
bool maybe = imwrite("./testimage.jpg", picture);

Since . denotes the current working directory.