在OpenCV中,int main(int argc, char **argv)中的argc和argv的意义

3
在以下用于在openCV中加载和显示图像的程序中:
#include <opencv2/core/core.hpp>   
#include <opencv2/highgui/highgui.hpp>  
#include <iostream>

using namespace cv;  
using namespace std;

int main( int argc, char** argv )  
{  
    if( argc != 2)   
    { 
     cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
     return -1;
    }

    Mat image;
    image = imread(argv[1], CV_LOAD_IMAGE_COLOR);   // Read the file

    if(! image.data )                              // Check for invalid input
    {
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }

    namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display.
    imshow( "Display window", image );                   // Show our image inside it.

    waitKey(0);                                          // Wait for a keystroke in the window
    return 0;
}

我无法理解程序员如何指定输入图像。这是因为argv [1]只是一个数组元素,我认为它与要指定的图像没有任何关系,并且在程序中没有定义。有人能解决我的疑惑吗?

还有一件事:在检查if(argc!= 2)的“if”语句中检查了什么?


请查看https://dev59.com/jWDVa4cB1Zd3GeqPdWwD#9281217。 - Bull
4个回答

6
main( int argc, char** argv )
           |            |
           |            |
           |            +----pointer to supplied arguments
           +--no. of arguments given at command line (including executable name)

例子:

display_image image1.jpg

在这里,
argc will be 2
argv[0] points to display_image
argv[1] points to image1

if(argc !=2 )
   ^^ Checks whether no. of supplied argument is not exactly two

谢谢您的回复...但是我何时需要写“display_image iamge1.jpg”,我的意思是我们将在程序中编写它吗? - venus
1
@venus 当你编译和链接程序时,它将生成一个与.cpp文件同名的可执行文件。在终端上(Linux)使用./display_image image1.jpg,或在命令提示符上(Windows)使用display_image.exe image1.jpg。有关更多详细信息,请搜索“如何在C++中使用命令行参数”。 - P0W
@POW 感谢您的指导...它起作用了...再次感谢您。 - venus

1
该程序旨在从命令行调用,使用一个参数指定文件名:
$ display_image filename.jpg

在这种情况下,argv[1]将是指向字符串"filename.jpg"的指针。

谢谢您的回复...但是文件名代表什么意思呢...是图片名称吗?我正在使用Eclipse,那么我可以使用命令行界面吗?如果我的问题听起来很傻,请原谅我打扰您。 - venus
是的,这是一个命令行程序,您可以通过输入程序名称和要处理的文件名称来运行它。很抱歉我不了解Eclipse,但我相信它有一种方法可以为目标程序指定命令行参数。 - Paul R

1
当用户通过命令行界面运行程序时,他们可以在输入程序名称后指定文件路径:imdisplay image.jpg argc 包含总参数数,包括程序名称。因此,如果用户没有输入图像名称,则 argc 为 1 。argv 是一个大小为 argcchar*数组。因此,argv[0] 是用户输入的程序名称,argc[1] 是第一个参数。 if (argc != 2) 表示用户错误使用了程序。

谢谢您的回复...但是您所说的程序名称是指什么?是指项目中的.cpp文件名(例如在Eclipse中)吗?我应该在哪里写imdisplay image.jpg? - venus

0

如果您正在使用 Visual Studio

argv[1] 对应于 [项目属性]->[配置属性]->[调试]

它可以设置图像名称和地址


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接