最近在研究opencv,用的最新版的3.2.0,一路上遇上不少坑。
今天看了一下官方的文档:http://docs.opencv.org/2.4/doc/tutorials/tutorials.html
本来是想找一找手册,顺便试试范例的。谁知道,第一个例子就跑不出来。
Image Watch: viewing in-memory images in the Visual Studio debugger
代码如下:
// Test application for the Visual Studio Image Watch Debugger extension
#include // std::cout
#include // cv::Mat
#include // cv::imread()
#include // cv::Canny()
using namespace std;
using namespace cv;
void help()
{
cout
<< "----------------------------------------------------" << endl
<< "This is a test program for the Image Watch Debugger " << endl
<< "plug-in for Visual Studio. The program loads an " << endl
<< "image from a file and runs the Canny edge detector. " << endl
<< "No output is displayed or written to disk."
<< endl
<< "Usage:" << endl
<< "image-watch-demo inputimage" << endl
<< "----------------------------------------------------" << endl
<< endl;
}
int main(int argc, char *argv[])
{
help();
if (argc != 2)
{
cout << "Wrong number of parameters" << endl;
return -1;
}
cout << "Loading input image: " << argv[1] << endl;
Mat input;
input = imread(argv[1], CV_LOAD_IMAGE_COLOR);
cout << "Detecting edges in input image" << endl;
Mat edges;
Canny(input, edges, 10, 100);
return 0;
}
使用的是VS2013,新建项目,调整完了项目的引用目录、库目录和链接器依赖等选项(指向3.2.0发布版),链接器的lib中,选用的是带d的debug版,工程选择生成debug,64位。
测试时,发现不单只程序显示不出图片,单步调试时,input中数据始终为空。(可用input.data判断,或者在debug的变量窗口查看)。
参考了许多网上的解决方法,总结主要有一下几种(可能有一种适合你):
1.cmake重新编译opencv,并重新配置项目的依赖(有部分库在发布版中移除)
2.imread()第一个参数,使用绝对路径,即:“D://sample//1.jpeg”
3.在代码头添加#pragma comment(lib,"opencv_highgui320d.lib"),告诉程序使用debug的库
4.项目链接库选项中,release版和debug版的库添加正确,debug添加结尾带有d.lib,release添加无d的lib
5.换用release调试程序
6.检查生成的平台(即根据VS版本和opencv的版本,选择x64或者win32)
以上的方法,我基本都试过了,最后仍未解决。我自己检查过项目配置,因此认为主要问题出在了lib上。(我是用cameracapture和其他函数,测试过捕捉、显示都正常)
首先,opencv的发布版,lib只有opencv_world320.lib和opencv_world320d.lib两个,而范例用到的highgui在以往是在highgui.lib中。仅加入#pragma comment(lib,"opencv_highgui320d.lib")不单只可能解决不了问题,还会引起报错,从而需要添加新的lib依赖。
这边先告诉遇到这个问题的人,imread为空的问题,出在lib库上。
以下是解决问题的方法和步骤:
1.现在opencv3.2.0-contrib版,在git上有。这个库与正式发布版不同的是,带有一些测试性的模块以及非免费性质的库。
2.使用cmake和vs编译重建工程,具体步骤CSDN有很多,百度也能找到。
3.在根目录下的install文件夹里,会出现opencv3.2.0的完整库(包括测试性和nonfree模块)
4.在你的VS项目工程中,移除原本的库依赖和引用,把install里面的include bin lib给添加进去
5.在链接器中,添加lib(所有的lib在install目录下的x64/v12/lib中),这里给出3.2.0的lib清单,可以直接复制:
opencv_aruco320d.lib
opencv_bgsegm320d.lib
opencv_bioinspired320d.lib
opencv_calib3d320d.lib
opencv_ccalib320d.lib
opencv_core320d.lib
opencv_cudaarithm320d.lib
opencv_cudabgsegm320d.lib
opencv_cudacodec320d.lib
opencv_cudafeatures2d320d.lib
opencv_cudafilters320d.lib
opencv_cudaimgproc320d.lib
opencv_cudalegacy320d.lib
opencv_cudaobjdetect320d.lib
opencv_cudaoptflow320d.lib
opencv_cudastereo320d.lib
opencv_cudawarping320d.lib
opencv_cudev320d.lib
opencv_datasets320d.lib
opencv_dnn320d.lib
opencv_dpm320d.lib
opencv_face320d.lib
opencv_features2d320d.lib
opencv_flann320d.lib
opencv_fuzzy320d.lib
opencv_highgui320d.lib
opencv_imgcodecs320d.lib
opencv_imgproc320d.lib
opencv_line_descriptor320d.lib
opencv_ml320d.lib
opencv_objdetect320d.lib
opencv_optflow320d.lib
opencv_phase_unwrapping320d.lib
opencv_photo320d.lib
opencv_plot320d.lib
opencv_reg320d.lib
opencv_rgbd320d.lib
opencv_saliency320d.lib
opencv_shape320d.lib
opencv_stereo320d.lib
opencv_stitching320d.lib
opencv_structured_light320d.lib
opencv_superres320d.lib
opencv_surface_matching320d.lib
opencv_text320d.lib
opencv_tracking320d.lib
opencv_video320d.lib
opencv_videoio320d.lib
opencv_videostab320d.lib
opencv_xfeatures2d320d.lib
opencv_ximgproc320d.lib
opencv_xobjdetect320d.lib
opencv_xphoto320d.lib
6.重新生成工程,这个时候,input=imread应该就可以获得打开图片的输入值了
7.使用一个循环来查看打开的图片吧!
while (key != 27)
{
key = cvWaitKey(50);
imshow("1", input);
}