imread() won't read string variable in c++ - c++

char file[1024];
FILE *f;
f= popen("zenity --file-selection", "r");
std:: string result = fgets(file,1024,f);
Mat img = imread(result, CV_LOAD_IMAGE_COLOR);
if(img.empty())
{
cout<<"Image is empty";
return -1;
}
resize(img,img,Size(40,56));
.........
.........
The output to the above code is "Image is empty"
The imread() function from opencv is not recognizing the path(string) hence unable to read the image. How to resolve this?
Thanks for help in advance!

Related

OpenCV VideoCapture works inconsistently

I have been trying to get my application using OpenCV to work for a while now and a longstanding error which I cannot seem to fix is this one:
PROBLEM:
OpenCV's VideoCapture is inconsistent in splitting video into frames for different file formats and codecs.
Specifics:
My errors are in one part of the application: splitting videos into frames. There are three current scenarios when I choose a valid directory for VideoCapture and open it. It either:
Opens and works perfectly.
Is able to open the VideoCapture (cap.isOpened() = true) but receives an empty frame or two during the frame split which causes app to throw error.
Does not open at all.
A given video will only do one of those three things. AVI File formats seem to have most of the errors, though.
Fixes tried:
Installing K-Lite Codec Pack Full
Putting OpenCV_FFMPEG.dll and OpenCV_FFMPEG_64.dll in project directory and in PATH
The only explanation I can think of is this is an error with the way I installed OpenCV and FFmpeg.
Any help would be greatly appreciated! Thanks.
By the way, I am running Qt 5.8.0 and OpenCV 3.2.0 and this is my FrameSplit code.
vector<int> mainFrame::frameSplit(string filename, string location)
{
//Extract + Save Frames
string vidDir = filename;
string locationDir = location + "/frames/";
VideoCapture cap(vidDir);
if (!cap.isOpened())
{
qDebug() << "OO";
return {};
}
else
{
Mat firstFrame;
Mat nextFrame;
Mat frame;
int count = 1;
QProgressDialog progress("Extracting files...", "Abort", 0, cap.get(CV_CAP_PROP_FRAME_COUNT));
progress.setWindowModality(Qt::WindowModal);
progress.setAttribute(Qt::WA_DeleteOnClose, true);
progress.setFixedSize(500, 100);
progress.show();
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);
qDebug() << cap.get(CV_CAP_PROP_FRAME_COUNT);
bool failure = false;
for (count = 1; count < cap.get(CV_CAP_PROP_FRAME_COUNT); count++)
{
cap >> frame;
if(frame.empty()) {
QMessageBox messageBox;
messageBox.critical(this, "Error", "There was an error in analyzing the video. Please try and install the appropriate codecs and try again.");
messageBox.setFixedSize(600,400);
vector<int> empty;
return empty;
}
string filePath = locationDir + to_string(count) + ".jpg";
imwrite(filePath,frame,compression_params);
progress.setValue(count);
}
progress.setValue(count);
progress.close();
vector<int> props;
props.push_back(cap.get(CV_CAP_PROP_FRAME_COUNT));
props.push_back(round(cap.get(CV_CAP_PROP_FPS)));
props.push_back(cap.get(CV_CAP_PROP_FRAME_WIDTH));
props.push_back(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
qDebug() << props[0];
return props;
}
}

Video Capture : Frame always empty - opencv

I am working with openCV Version 2.4.9, and on Mac OSX.
I have written this code for loading and displaying a video on my desktop. But it never seems to work. I always get the output as "frame empty". Thus it does not complain about reading the video using VideoCapture.It is NOT able to capture any frames, and thus 'frame' is always EMPTY. Any idea what the problem might be?
Note: I have tried both ways to capture a frame - commented as try 1 and try2.
int main(int argc, const char * argv[])
{
Mat frame;
VideoCapture capture_ir("/Users/shreyatandon/Desktop/resize_ir.avi");
if ( !capture_ir.isOpened() ) // if not success, exit program
{
cout << "Cannot open the video file" << endl;
return -1;
}
for (;;){
// capture_ir.read(frame); //try1
capture_ir>>frame; //try2
if(frame.empty()){
std::cerr<<"frame is empty"<<std::endl;
break;
}
imshow("", frame);
waitKey(10);
break;
}
return 0;
}
Just made it work.
Mat current_frame;
VideoCapture video("video.avi");
while(true)
{
video.read(current_frame);
imshow("Image",current_frame);
}
If you keep having problems using avi format have a look at your links to the ffmpeg libraries and it dependencies. I tried to install it from scratch using homebrew and it is working without problems. Cheers

Unexpected result when Comparing sample image with database of images - Opencv c++

I am working on Image matching program, it captures image from IR camera stores it in one directory. A database of images exist in a different directory. I get an unexpected result while executing. I somehow realize that it's because I'm messing with different directories and something basic. Any help in getting around the mistake? Here's a snippet of the code.
VideoCapture cap(0);
Mat frame;
Mat src, dst, tmp,img_3,img_4;
filename3 = (char *)malloc(sizeof(char));
printf("\n-------------------------------------------------\n");
printf("\nOne to Many Image matching with SURF Algorithm.\n");
printf("\n-------------------------------------------------\n");
//Get the Vein image from Webcam that needs to be compared with the database.
// The below function gets frame and saves it in /home/srikbaba/opencv/veins
veincnt = captureVein(veincnt, cap);
if(veincnt == -1)
cout << "A problem has occured" << endl;
printf("\nPlease enter the filename of saved image with the extension.\n");
scanf("%s",filename3);
//Scan the directory for images.
DIR *dir;
struct dirent *ent;
clock_t tstart1 = clock(); //start clock function, do something!!!!
if ((dir = opendir ("/home/srikbaba/images")) != NULL)
{
/* print all the files and directories within directory */
while ((ent = readdir (dir)) != NULL)
{
if(ent->d_type!= DT_DIR)
{
//Print the images
printf ("%s\n", ent->d_name);
//Store the Filename
img_db = ent->d_name;
//Open each file name as Mat identifier and loop the process
img_3 = imread (filename3, IMREAD_GRAYSCALE);
//Filename3 is saved in /home/srikbaba/opencv/veins --> different directory
// I feel this is the problem
img_4 = imread (img_db, IMREAD_GRAYSCALE);
if( !img_3.data)
{
std::cout<< " --(!) Invalid filename or file not found! " << std::endl;
return -1;
}
Because of this I always get --(!) Invalid filename or file not found message. Is there a way I can compare one image from a directory and another image from a different directory? I hope what I asked is not confusing. Kindly help.
Working on Opencv - C++ on Ubuntu 12.04 LTS
You are getting undefined behavior because you are allocating space for only 1 character for filename3 in the following line:
filename3 = (char *)malloc(sizeof(char));
So in the following line...
scanf("%s",filename3);
Any file name greater than 1 character will invoke undefined behavior.
In my opinion, there is no need of malloc. You can just allocate large enough filename3 of fixed size like this:
char filename3[256];

opencv mp3 header missing

Hi i'm new to the openCV library. Just really installed in today and i was trying to do some basic stuff like show a picture in a window and show a video in a window.
I got both of these to work but when i try and show the video it plays without sound and i get the following
[mp3 # 0x107808800] Header missing
in the console. How do i add the mp3 header so it plays with sound?
here is my code
int main(int argc, const char * argv[])
{
if (argc<2) {
printf("not enough arguments");
return -1;
}
//create a window
namedWindow(windowName,WINDOW_AUTOSIZE);
Mat frame;
//capture video from file
VideoCapture capture;
capture.open(argv[1]);
int run=1;
while (1) {
//make play and pause feature
if (run !=0) {
capture>>frame;
imshow(windowName, frame);
}
char c=waitKey(33);
if (c=='p') {
run=1;
}
if (c=='s') {
run=0;
}
if (c ==27 || c=='q') {
break;
}
}
return 0;
}
you can't .
audio gets discarded (that's the message you get), and there's no way to retrieve it again.

doesn't save any image.. when saving frames of a video [duplicate]

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Cant save image using OpenCV
I have tried following code,please see this and tell me what did i wrong.but there is not compile error.after i run the program it doesn't save any image.
#include"stdafx.h"
#include<cv.h>
#include<highgui.h>
#include<cxcore.h>
int main(int argc, char* argv[]) {
int c=1;
IplImage* img=0;
char buffer[1000];
CvCapture* cv_cap=cvCaptureFromCAM(-1);
cvNamedWindow("Video",CV_WINDOW_AUTOSIZE);
while(1) {
img=cvQueryFrame(cv_cap);
cvShowImage("Video",img);
sprintf(buffer,"D:/image%u.jpg",c);
cvSaveImage(buffer,img);
c++;
if (cvWaitKey(100)== 27) break;
}
cvDestroyWindow("Video");
return 0;
}
can you tell me how to save a image .above program doesn't save any images.please give me your suggestions.thank you.
IplImage *destination = cvCreateImage(cvSize( img->width, img->height ), IPL_DEPTH_8U,1);
cvCvtColor( img, destination, CV_RGB2GRAY );
cvSaveImage( "C:/Users/SP/Desktop/sample.jpg", destination );
It converts to grey image; use it as desired.
Hope this works.
Probably a permissions problem, only admin can write to the top level folder
Try making a sub-directory and writing to eg sprintf(buffer,"D:/data/image%u.jpg",c);
I'll say this for the 100th time in these OpenCV posts: code safely by checking the return of the calls. cvSaveImage() returns 0 when it fails to save the image:
if (!(cvSaveImage(buffer,img))
{
std::cout << "!!! Failed to save image" << std::endl;
}
If you see the error message being displayed, you should check if the destination directory exists and if your user has the authorization to create files inside it.