2013-07-03 117 views
1

我想在我的程序中加载大量图像,稍后将它们缝合在一起。我正在使用命令行来提及图像地址。它的工作原理,如果我事先知道图像的数量我会在输入,但它并不适用于输入图像的变量数:如何使用命令行参数在opencv中读取多个图像文件?

if (argc < 3) 
{ 
    cerr<<"Usage:" << argv[0] << "SOURCE DESTINATION" << endl; 
    return 1; 
} 

for (int i = 0;i <argc;i++) 
{ 
    Mat img[i] = imread(argv[i+1], 0); 
    imshow("image", img[i]); 
} 

是否有其他方法来获得在这种情况下输入。我需要处理20到25张图像。我可以使用一些文件,存储地址并阅读它。我认为这是可能的,但它是如何工作的?

编辑:

一些修改后,我的程序现在这个样子:

#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 
#include "opencv2/core/core.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc_c.h" 
#include <opencv2/imgproc/imgproc.hpp> 
#include "opencv2/calib3d/calib3d.hpp" 
#include <math.h> 
#include <cmath> 

#define PI 3.14159 
#define max_img 25 

using namespace cv; 
using namespace std; 

//main function 
int main(int argc, char** argv) 
{const int MAX_NUM_OF_IMG = 1024; 
cv::Mat img[MAX_NUM_OF_IMG]; 
for(int i=1;i<argc;i++) 
    { 
std::cout << i << ": " << argv[i] << std::endl; 
    img[i-1] = imread(argv[i],0); 
std::cout << "Finished reading images1" << std::endl; 
    imshow("image",img[i]); 
//start stitching operations 

    }std::cout << "Finished reading images2" << std::endl; 
cv::waitKey(); 
return 0; 
} 

我给在命令行下面:

./img_many camera3/imageb-032.jpgcamera3/imageb-033.jpgcamera3/imageb-034.jpgcamera3/imageb-035.jpgcamera3/imageb-036.jpgcamera3/imageb-037.jpgcamera3/imageb-038.jpgcamera3/imageb-039.jpg 

我得到的输出是

1: camera3/imageb-032.jpgcamera3/imageb-033.jpgcamera3/imageb-034.jpgcamera3/imageb-035.jpgcamera3/imageb-036.jpgcamera3/imageb-037.jpgcamera3/imageb-038.jpgcamera3/imageb-039.jpg 
Finished reading images1 

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /build/buildd/opencv-2.3.1/modules/core/src/array.cpp, line 2482 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /build/buildd/opencv-2.3.1/modules/core/src/array.cpp:2482: error: (-206) Unrecognized or unsupported array type in function cvGetMat 

Aborted (core dumped) 

是否可以从命令行读取多个图像,并将它们作为参数?它为什么会崩溃?

+0

你试过imshow(“image”,imread(argv [i + 1],0)); ? – Alexis

+0

如果将图像拼接在一起,您可能会发现它有帮助。不完整,而是一个开始。 http://stackoverflow.com/questions/13893464/in-opencv-how-do-i-copy-and-scale-a-greyscale-image-into-another-colour-image – Emile

回答

2

我不认为这编译。 您必须分配圈外CV的数组::垫

const int MAX_NUM_OF_IMG = 1024; 
cv::Mat img[MAX_NUM_OF_IMG]; //You could also allocate this dynamically based on the number of arguments/the value of argc 

然后,在循环中,你正在打破界限,你必须改变这样的:

for(int i=1;i<argc;i++) //You should also check you have not more than MAX_NUM_OF_IMG 
    { 
    img[i-1] = imread(argv[i],0); ///What is zero by the way 
    imshow("image",img[i]); 
    //Probably here you want some short sleep, or a "press a key" event 
    } 

你得到的图像的数量是argc-1

然后,如果你想拥有存储在一些txt文件的文件名,你可以使用类似的std :: ifstream的解析它,因为它是给std :: cin 。有成千上万的例子,像这样How To Parse String File Txt Into Array With C++

+1

零指如果图像将被读取作为灰度或不,如果我没有错 –

+1

谢谢安东尼奥! Boyko就像你说的那样,零是用来装灰度的。 –

+0

Anotonio,我试过,收到这个错误在运行时:OpenCV的错误:在cvGetMat为标志(参数或结构域)(无法识别的或不支持的阵列型),文件/build/buildd/opencv-2.3.1/modules/core /build/buildd/opencv-2.3.1/modules/core/src/array.cpp:2482:/src/array.cpp,线路2482 终止抛出 'CV ::例外' 的一个实例后 什么()被称为:错误:在功能cvGetMat(-206)无法识别的或不支持的阵列型 中止(核心转储) –

1

如果在你的负载循环,你会基本上得到闪烁的负载有imshow。只需将你的iamges首先加载到你的数组中。

for(int i=1;i<argc;i++) 
{ 
    std::cout << i << ": " << argv[i] << std::endl; 
    img[i-1] = imread(argv[i],0); 
    std::cout << "Finished reading images1" << std::endl;   
} 

然后尝试显示您的图像。

imshow("image",img[0]); 

您可以尝试通过显示您的图片添加一个按键循环。我认为有一个openCV教程已经显示了这一点。

我敢肯定,我已经看到了这个错误了几次,每次都出于不同的原因。图像只是数组,所以你的图像有一些问题。这可能是一个糟糕的JPG。

通过在循环不显示的每个图像,你会希望看到如果有一个形象造成问题。

还要确保“我”在你的循环不会到达25,即一个出界异常。你也可以放入try/catch语句来帮助识别错误发生的时间。

希望能帮助您缩小问题范围。

+0

谢谢,埃米尔。有用。 –

相关问题