C++修改main()函数的argv

当argv[1]被重新赋值后,如果数组越界,会把argv[2]中的内容挤掉,argv[2]中存储的是argv[1]中越界的部分

#include <opencv2/opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2/core/core.hpp>
#include <fstream>
#include <iostream>
#include "darknet.h"
#include "time.h"

#include  <direct.h>
#include <string.h>
#define MAX_PATH 260

using namespace std;
using namespace cv;

/*
xxxx.exe -in/in/xxx.jpg -out/out/xxx/jpg
1.从argv[1]读取图像
2.保存图像至argv[2]
*/


int main(int argc, char* argv[])
{

	int detec_box_num = 0;

	//float m_fProbThres = 0.25;
	try
	{


		string argv2_backup = argv[2];//将argv[2]备份,因为后续将argv[1]变成绝对路径后,argv[2]存储的是argv[1]越界的部分

		cv::Mat frame;

		//利用合成路径给构造函数传参

		//获取当前项目路径,exe所在
		char   buffer[MAX_PATH];
		std::string   exe_abs_path;
		_getcwd(buffer, MAX_PATH);//获取当前路径
		exe_abs_path = buffer;//转存到string中
		//printf("%s", exe_abs_path);
		//将路径与参数拼
		string na = "//obj.names";
		string cf = "//yolo-obj.cfg";
		string we = "//yolo-obj_final.weights";

		na = exe_abs_path + na;
		//printf("names_file:%s", na);
		cf = exe_abs_path + cf;
		we = exe_abs_path + we;


		darknet detector(na,cf,we);//定义探测器

		//frame = cv::imread("..\\obj_xiqing\\000001.jpg");//读取指定路径


		//合成输入图像的绝对路径
		string img_name = argv[1];
		string abs_img_path = exe_abs_path +"//"+ img_name;
		strcpy( argv[1],abs_img_path.c_str());
		printf("输入图像地址%s", argv[1]);
	    frame = cv::imread(argv[1]);//从命令行读取图像

		clock_t start, finish;
		start = clock();
		std::vector<bbox_t> result_vec = detector.detect(frame);//检测图像
		detec_box_num = result_vec.size();//保存检测框的数目
		finish = clock();

		printf(" Predicted in %lf seconds.\n", (double)(finish - start) / CLOCKS_PER_SEC);
		detector.draw_boxes(frame, result_vec, detector.obj_names);//将检测框画与图像上


		printf("原始argv[2]%s\n", argv[2]);
		//合成存储路径
		string write_img_name = argv2_backup;
		printf("赋值后的argv[2]%s\n", argv[2]);
		string abs_img_write_path = exe_abs_path + "//" + write_img_name;
		strcpy(argv[2], abs_img_write_path.c_str());
		printf("最终的argv[2]%s\n", argv[2]);
		cv::imwrite(argv[2], frame);//将检测结果保存至命令行规定目录下

		/*cv::namedWindow("test", WINDOW_AUTOSIZE);
		cv::imshow("test", frame);
		cv::waitKey(10000);*/
	}
	catch (...)
	{
		return -1;
	}
	
	return detec_box_num;//返回检测框的数目
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值