Why does OpenCV reject cvLoadImage("string.ext"), but accept cvLoadImage(argv[1])? - c++

#include "cv.h"
#include "highgui.h"
#include <stdio.h>
int main(int argc, char* argv[]){
cvNamedWindow("Window1", CV_WINDOW_AUTOSIZE);
IplImage* image = 0;
->->image = cvLoadImage(argv[1]);<-<-
if(!image) printf("Unable to load image!");
cvShowImage("Window1", image);
char c = cvWaitKey(0);
cvReleaseImage(&image);
cvDestroyWindow("Window1");
return 0;
}
If I replace the indicated line with cvLoadImage("247.png") I get a blank window and image remains equal to zero
If I run the exe and give it 247.png as an argument, it's just dandy. If I put the "247.png" right into the code and build and run it Visual Studio 2008, it fails. If I build and run from the command prompt, it works.
Why is this? I'm a little bit weary of moving forwards without getting this down.

Are you certain "247.png" is in the current working directory when you have the name hardcoded?
Run the program under something like Process Monitor to see what file is really being opened (or what file I/O errors there might be).
After your edit to add more information to the question (the problem occurs when run from VS2008) this is almost certainly your problem. The current directory that VS starts the program under is not the directory that has the "247.png" file.

Under Project->Properties->Configuration Properties->Debugging there is a field "Working Directory". Set that to the directory you want to execute in and that should fix the problem.

Can you check to see what your cwd is?
You can #include <direct.h> and use the _getcwd function to see what it is. That will probably point you to the culprit.

Related

Encountered Segmentation fault in simple OpenCV code

Tools
Platform : 64-bit Windows
Compiler chain: mingw with Qt
Make system: CMake
Libraries: C++ 11, OpenCV 4, Qt 5
Problem (Updated)
The following simple program segment should compile and display the generated image in OpenCV. However, it always SIGSEGVs in DEBUG mode only(Backtrace at the end). However, it works just fine in RELEASE mode.
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
void testOPENCV()
{
cv::Mat output(480, 640, CV_8UC3, cv::Scalar(255,0,100));
cv::namedWindow( "Test", cv::WINDOW_AUTOSIZE );
cv::imshow("Test",output);
cv::waitKey(0);
}
int main(int argc, char** argv)
{
testOPENCV();
return 0;
}
I have a CMake script that builds only the required OpenCV modules and links these to the dependencies. The relevant part:
build_external_project(opencv "https://github.com/opencv/opencv.git" "4.2.0" "-DCMAKE_INSTALL_PREFIX=${THIRDPARTY_INSTALLFOLDER} - DCMAKE_BUILD_TYPE=${THIRDPARTY_BUILDTYPE} -DBUILD_LIST=core,imgproc,imgcodecs,highgui")
target_link_libraries(OpenVideo ${OpenCV_LIBS})
The binary can be run with no missing dll errors. Dependency walker also indicates the same.
Here is the backtrace:
Given that OpenCV works fine in Release mode, I suggest rebuilding the Debug version of the library.
Previous answer:
There are a few potential problems with your code:
Using Qt is unnecessary on this example and it adds a complexity that you don't need right now. Remove it from the project and its libraries on the link instruction in the CMake script. Later, you can bring it back to see if it causes of the crash. Right now you need to pinpoint if the problem is in OpenCV or Qt.
An image can only be displayed on a window if cv::waitKey() is invoked;
The directory separator on Windows is usually \\ and not /;
This is the full source code to test your OpenCV build:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main()
{
std::string file_name("C:\\Images\\1.jpg");
cv::Mat original_image = cv::imread(file_name, cv::IMREAD_COLOR);
if (original_image.empty())
{
std::cout << "!!! image not found" << std::endl;
return -1;
}
cv::imshow( "Display window", original_image );
cv::waitKey(0);
return 0;
}
Few things to check here.
First, where do the OpenCV library come from? Is it compiled for your CPU? Looks like it crashed in AVX instructions. Might be that CPU does not support them.
Second, not obvious at all, happened to me with .png files. Same segfault during runtime. Turned out that OpenCV was built without png support. Please check if your OpenCV built with -DWITH_JPEG=ON.
https://docs.opencv.org/2.4/doc/tutorials/introduction/display_image/display_image.html
You forgot to create window
namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
Adding to karlphillips answer: Deubg and Release behave quite differently on Windows than on Linux (due to runtime selection).
Especially if you link against release libraries on Windows but your libs or executable are being built in debug. If they use different runtimes you will be very likely run into issues and segfaults. So check the flags of both projects (typical culprits are flags like multithreading (debug) being present on one but not the other).

openCV libraries call local path that does not exist

i am making a simple c++ program with openCV library included. Eclipse IDE recognises openCV commands and library locations, but when i try to build the project, compiler gives external error, referring to opencv.hpp or core.hpp file calling a "opencv2/core.hpp" path, which does not exist in opencv folder. I figured out that the problem is linked to the way core.hpp is called, but the library files are read-only.
From what i saw in opencv.hpp file, this relative "opencv2/[module].hpp" reference is not only for the core, but all other modules as well. There is no opencv2 folder inside the one to where openCV is installed at all, in fact.
I've tried reinstalling and remaking openCV with different making arguments, using a different IDE and including direct search folders in eclipse. The problem, apparently, lies in the files themselves, or the way it maybe gets installed in the system the wrong way. The problem persists on both my main ubuntu machine and the ARMbian orange pi.
i get this error when trying to include any openCV library that contains
#include "opencv2/[opencv module].hpp" in it
as a result, compilation is terminated with the error message stating "/usr/local/include/opencv4/opencv2/opencv.hpp:52:28: fatal error: opencv2/core.hpp: No such file or directory"
edit 1: GCC c++ compiler options are -Iusr/local/include/opencv4/opencv2 -O3 -Wall -c -fmessage-length=0 and linker's options are -L/usr/local/lib.
The code is a simple displayImage
#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main( int argc, char** argv )
{
Mat image;
image = imread( argv[1], 1 );
namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
imshow( "Display Image", image );
waitKey(0);
return 0;
}
edit 2: $ pkg-config --libs opencv does not see openCV as installed in the system, altho i've made sure to run make install and ldconfig on the path. This may be a signal of faulty installation, but this is just a sidenote, not entirely related to main problem. I have tried reinstalls and to different folders, but this also persists as well as a main problem
apparently, #sgarizvi 's comment was the answer. I just needed to set the include path to I/usr/local/include/opencv4 and it worked. After that, the error was fixed.
I am replying to my own question to close the case, as i cannot upvote/veryfy a comment
In your case, since your include path is /usr/local/include/opencv4/opencv2
Replace the first three lines
#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
by
#include <opencv.hpp>
#include <imgproc.hpp>
#include <highgui.hpp>

How to open input file, C++ on visual studio community 2015?

Does anyone know why the file isn't opening? I also tried just putting "infile.txt" and placing it in the folder of the program and also the debug folder but the ways I used to check for open error both triggered meaning that it could not open. I know I can hard code the location but I don't want to.
I heard you should do stringobj.c_str() but I don't know if that's accurate?
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
ifstream infile;
ofstream outfile;
string fileloc = "infile.txt";
infile.open(fileloc);
if (!infile)
{
cout << "open fail 1" << endl;
}
bool fail = infile.fail();
if (fail)
{
cout << "open fail 2";
}
return 0;
}
Note that the directory structure (at least for VS2013) is
<base>
- Solution Directory
- Debug
- Release
- Project Directory
- Debug
- Release
The program by default runs in the project directory (even though it is built to the solution/debug directory).
If you accepted the default naming convention when starting your project, you should be putting your file in the "Projects\ConsoleApplication1\ConsoleApplication1" directory, not "Projects\ConsoleApplication1"
Check your working directory in Project Settings -> Debugging. Make your file available there.
First, the documentation for the signature of
std::ifstream::open( const char * filename, ios_base::openmode mode=ios_base::in)
does indicate it requires a const char *, exactly what std::string::c_str() provides. However, there is an overload for open which accepts a const str &, which means it works the same way for both on most implementations.
Otherwise, what you're grappling with is known as the current working directory (or cwd). Apparently you're not sure where THAT directory is. It may be different while you run the debugger on Visual Studio than it is when you run your program from the command line, and it may be different in various IDE's.
I'm not sure why you want to ensure your program only opens a file by name in the current directory, and not give the full path, but...
You may want to inquire what the current working directory is, so you can solve the mystery wherever you try this. In my Visual Studio 2015, the directory ends up being the directory ABOVE debug, but that depends entirely on how your project is configured, and we can't see that out here.
So, try:
std::string cwd = getcwd( NULL, 0 );
This requires a header <direct.h> on Windows in Visual Studio, but it will give you the directory you're trying to figure out.
with
string fileloc = "infile.txt";
if you put infile.txt in the same folder of the cpp file, it should be fine.
btw I delete your first line
#include "stdafx.h"
I use cygwin console, may have minor diff
For my issue - i was stuck at loading image by opencv - i was wrong to place directory with jpg in the root of the C++ project
WRONG:
CORRECT:

Open CV, C++: "Error: The application was unable to start correctly (0x0000005)."

I started working on OpenCV recently and configured OpenCV and MingW. I'm using Windows 7 OS. I am not using any IDEs for my programs. But still I am comfortable with the way I am doing the programs for now.
I wrote my first program and it compiled successfully but when I ran the .exe file it gave an Application error as :
The application was unable to start correctly (0x0000005). Click OK to close the application.
The following is the code I wrote:
#include "cstdlib"
#include "iostream"
#include "opencv2/highgui/highgui.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("v.jpg", CV_LOAD_IMAGE_COLOR);
if (img.empty())
{
cout << "Error: Image cannot be loaded...!!" << endl;
system("pause"); //wait for a key press
return -1;
}
namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
imshow("MyWindow", img);
waitKey(0);
destroyWindow("MyWindow");
return 0;
}
And for execution, I wrote a batch file as follows and executed it::
g++ -I"D:\opencv\opencv\build\include" -L"D:\opencv\opencv\build\x86\mingw\lib" ImageTest1.cpp -lopencv_core246 -lopencv_highgui246 -o ImageTest1.exe
ImageTest1.exe
pause
I also have added the following to the system path::
D:\MingW\bin;;D:\MingW\msys\1.0\bin;;D:\OpenCV\opencv\build\x64\mingw\bin;;
I tried changing the x64 to x86. But that didn't work.
Edit: I executed the .exe as admin and it says The application was unable to start correctly (0xc000007b). Click OK to close the application
I don't believe that you have reported the error code accurately. I do not believe that the error code contains only 7 hex digits. It contains 8. I believe that you have missed off the first digit, which I bet is c. In which case the error message really is:
The application was unable to start correctly (0xc0000005).
Now, that code is the NT status code STATUS_ACCESS_VIOLATION. When the system tells you that the application was unable to start this means that the error is happening during the loader's code. In other words, your code has not even started running yet. The error will be occurring in the DllMain function of one of your dependent DLLs.
Most likely there is some incompatibility between the different DLLs that are being loaded. In order to debug this further you'll probably need to debug the loading process. Start by running Dependency Walker in profile mode to find out which module's DllMain is raising the exception. Hopefully Dependency Walker will be able to point you towards the mismatch that exists in your dependent libraries.
Put system imports in <> brackets. This is for <cstdio> and <iostream>.
EDIT: I misread the error code. Please ignore the rest of my answer.
It seems windows cannot locate the libraries on startup.
My assumption is based on the 0x7B error.

OpenCV 2.3 and Visual Studio 2010

I am having so much trouble installing openCV 2.3 with visual studio 2010. Crash after crash, installation after installation and after several weeks I've had no luck.
Unfortunately there are no installation documents for openCV 2.3 and the directory structure and file locations are different from openCV 2.2 which makes the current tutorials almost useless. :(
Has anyone out there had any success with openCV 2.3? Can someone please try it and let me know if its an openCV build issue or my setup?
Or maybe someone can suggest an alternative to openCV. What my end goal is, is to get Pixel info, use inpaint functions, and basic image processing for After Effects and Maya.
EDIT: Sorry I thought I posed the error! This is what happens when I run the code:
#include <iostream>
#include <cv.h>
#include <highgui.h>
using namespace cv;
int main()
{
Mat image;
image = imread( "c:/image1.png", 1 );
namedWindow( "Gray image", CV_WINDOW_AUTOSIZE );
imshow( "Gray image", image );
waitKey(0);
return 0;
}
It runs until imshow. If I comment out imshow it runs fine with no errors.
Here is the errors when I add IMSHOW:
Unhandled exception at 0x76bfb727 in openCV_test.exe: Microsoft C++ exception: cv::Exception at memory location 0x0015ec20. and it gives me the option to break or continue.
This is what the output window shows:
First-chance exception at 0x76bfb727 in openCV_test.exe: Microsoft C++ exception: cv::Exception at memory location 0x0015ec20..
Unhandled exception at 0x76bfb727 in openCV_test.exe: Microsoft C++ exception: cv::Exception at memory location 0x0015ec20..
It then goes on to open SYSTEM.CPP and give me this:
- exc {msg="......\modules\core\src\array.cpp:2482: error: (-206) Unrecognized or unsupported array type
" code=-206 err="Unrecognized or unsupported array type" ...} const cv::Exception &
+ std::exception {_Mywhat=0x00000000 _Mydofree=false } std::exception
+ msg "......\modules\core\src\array.cpp:2482: error: (-206) Unrecognized or unsupported array type
" std::basic_string,std::allocator >
code -206 int
+ err "Unrecognized or unsupported array type" std::basic_string,std::allocator >
+ func "" std::basic_string,std::allocator >
+ file "......\modules\core\src\array.cpp" std::basic_string,std::allocator >
line 2482 int
Thanks!
I have OpenCV2.3 and had no problem to install it with Visual Studio v9.0.
What you should do to compile and run correctly your project in all the Visual Studio versions :
Properties of your project (right click on it)
C/C++
General
Include directory add the < your directory >\OpenCV2.3\include\opencv2, < your directory >\OpenCV2.3\include\opencv and < your directory >\OpenCV2.3\include
Linker
General
Add lib directory < your directory >\OpenCV2.3\lib
Input
Add all the libs like opencv_core230d.lib opencv_highgui230d.lib and so on...
Then don't forget to add the dll to your system path.
Configuration panel > System > Advanced > Environment variables > Path
you can add a user environment path which will override the other one,
just click New (if you have never added directory to your system path before) and write the path eg : < your directory >\OpenCV2.3\bin
Without more information, I hope it could help...
Julien,
Sometimes, the compiler cannot find the dll even if you have the correct path settings. At that point try copying the dll files from the openCV folder to ur current project (not solution) folder.
Rather than copy pasting I'll just link: http://theroundedengineer.blogspot.com/2011/07/opencv-23-for-vs-2008-from-source.html
Hopefully that helps. Granted I'm far from an expert on the differences between VS 2008 and VS 2010.
I got exactly the same problem. I couldn't read any image. I checked the data flag and image size. The flag indicated error and the size was always (0, 0). Although I do not know the actual cause, I somehow could avoid the problem and run my program fine.
At first, I compiled OpenCV myself. Even though all the dlls seemed to be created correctly and there was no build error, I noticed that the header folders are not correctly organized. Therefore, I switched to the superpack binary and tried static linking. There were a lot of undefined symbols at the beginning, so I basically just put everything into VS link options. The number of libraries I had to input to VS was quite absurd, but it is a good way to test if the superpack works.
These are what I use.
opencv_core230d.lib;opencv_calib3d230d.lib;opencv_contrib230d.lib;opencv_features2d230d.lib;opencv_highgui230d.lib;opencv_legacy230d.lib;opencv_ml230d.lib;opencv_imgproc230d.lib;opencv_video230d.lib;libjasperd.lib;libjpegd.lib;libpngd.lib;libtiffd.lib;zlibd.lib;
I also need to input Comctl32.lib to resolve linking error.
I tested my program with static libraries of superpack. Things work fine now.
The headers I used are
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
I do not try using dlls yet, but I can confirm that VS 2010 + OpenCV 2.3 64 bit from the superpack work. I hope you will have some luck with the superpack too.
(Hmm, I can't remember if I put opencv.hpp in the opencv2 folder myself, or if it was there right from the beginning. I did a lot of things to make it work and was a bit confused. But, I believe you can figure this out yourself if there is anything wrong about the header.)
Hope this helps,
Pinyo
You should try making a cycle structure:
#include <iostream>
#include <cv.h>
#include <highgui.h>
using namespace cv;
int main(){
Mat image;
namedWindow( "Gray image", 2 );
while(1){
image = imread( "d://Gaa6P.png", 1 );
imshow( "Gray image", image );
waitKey(0);
}
return 0;
}
Check your firewall. turn off firewall totally. Your antivirus may block the process too.
I had the same problem: cv::exception for memory and this was it's cause.