初学opencv心得:imshow中断退出问题和stitcher报错问题

来源:互联网 发布:逃犯 熊孩子 知乎 编辑:程序博客网 时间:2024/05/18 02:21


      初学,为了联系代码,写了个小程序,很小很小。就是遍历目录,将目录中的.jpg图片拼接在一起,但是程序一运行到imshow函数就中断退出,调试了半天,发现图片没有正常读取,所以imshow报错了。发现了问题后,又不知道怎么解决。正当郁闷时,想到opencv是不是配置出现了问题,于是在属性的链接里,把所有的链接器-》输入-》附加依赖项中的lib文件中,没有d的都去掉。结果瞬间程序运行顺畅。我靠,opencv配置太麻烦了,每次都需要重新配置,因为建立的是win32程序,我的机器是64位,每次修改64位时都需要重新配置一次,配置有偏差的话程序就运行报错。崩溃!也算积累经验了。

     紧接着stitcher又出现了问题。运行后好半天都不懂,于是终止了程序。把文件夹下的图片减少一些。本以为没问题了,结果程序运行到stitcher就报错退出。反复调试还是这个问题。status显示ERR_NEED_MORE_IMAGES。难道是图片少了?加几张,也不对。反复的调呀,反复的调。其实都没有问题,可能是图片或者程序强制退出后,需要一段时间释放资源之类的东西,在这段时间内,有些资源是被占用的,运行程序就报错。退出VS2010,重新编译一次,程序运行就正常了。这么个小程序,连写带调用了四个小时。情何以堪呀。(ps:还发现一个问题,文件夹下如果还有文件夹可能会报错的。)

     总结:stitcher函数使用方式建立一个imgs向量,将读取的mat图片用push_back压到imgs中。然后就是stitcher自己去拼接了。但是拼接的速度不敢恭维,两张图片大概需要7-8秒的时间。我用的是3872*2592大小的图片,用了27张拼接,跑了好久,现在还没跑完,所以没事干写博客记录这次不算成功的体验。

    程序出现一些诸如图片已多就无法拼接的问题。一种原因是可能图片没有重叠部分,因此无法拼接。还有就是可能函数的问题。为了解决这个问题,更安全的运行程序,对代码进行微调,就是先压进两张照片,然后再执行合并过程,之后每找到一张图片就合并一次,这样,程序运行后就稳定的多,而且能实时看到合并的装填。当遇到文件名是rusult.jpg时,程序退出。


#include <iostream>  #include <string>  #include <io.h>#include <fstream>#include <opencv2/opencv.hpp> #include "opencv2/stitching/stitcher.hpp"#include <opencv2/highgui/highgui.hpp>  using namespace std;  using namespace cv;  int main(int argc, char** argv)  {  // 图片集  string fileFolderPath = "图片目录";  string fileExtension = "jpg";  string fileFolder = fileFolderPath + "\\*." + fileExtension;  string filesaveName;vector<Mat> imgs;string result_name = "保存路径\\result.jpg";// 遍历文件夹  char fileName[1000];struct _finddata_t fileInfo;    // 文件信息结构体  第一次查找  long findResult = _findfirst(fileFolder.c_str(), &fileInfo);            if (findResult == -1)  {  _findclose(findResult);   return -1;  }   循环查找  Mat img1;Mat img2;Mat img3;do   {  sprintf(fileName, "%s\\%s", fileFolderPath.c_str(), fileInfo.name);filesaveName=fileFolderPath+"\\resize"+fileInfo.name;const char *p=filesaveName.c_str();if ( fileInfo.name != "    ")   {  printf("file: %s\n",fileName);img1=imread(fileName);                        //需要缩小图片的话可以用这段 //Size sz;//pyrDown(img1,img2,sz,BORDER_DEFAULT);//pyrDown(img2,img3,sz,BORDER_DEFAULT);//pyrDown(img3,img3,sz,BORDER_DEFAULT);imgs.push_back(img1);//imwrite(p,img1);imshow("WindowNew",img1);waitKey(1);}  } while (!_findnext(findResult, &fileInfo));    _findclose(findResult); destroyWindow("WindowNew");bool try_use_gpu = true;Mat pano;    Stitcher stitcher = Stitcher::createDefault(try_use_gpu);    Stitcher::Status status = stitcher.stitch(imgs, pano);if (status != Stitcher::OK)    {        cout << "Can't stitch images, error code = " << int(status) << endl;        return -1;    }imwrite(result_name, pano);return 0;  }


0 0