reshape有两个参数:

其中,参数:cn为新的通道数,如果cn = 0,表示通道数不会改变。

参数rows为新的行数,如果rows = 0,表示行数不会改变。

注意:新的行*列必须与原来的行*列相等。就是说,如果原来是5行3列,新的行和列可以是1行15列,3行5列,5行3列,15行1列。仅此几种,否则会报错。

sprintf(s,"%s%d%c","test",1,'2'); //第一个参数就是指向要写入的那个字符串的指针,剩下的就和printf()一样了


1
#include "opencv2/opencv.hpp" 2 3 using namespace cv; 4 #include <iostream> 5 6 int main() 7 { 8 FileStorage fs("SVM.xml", FileStorage::WRITE);; 9 if (!fs.isOpened()) 10 { 11 std::cerr << "failed to open " << std::endl; 12 } 13 14 int num = 1; 15 char path[90]; 16 Mat combineMat; 17 Mat img_input, p; 18 19 while (num <4) //1-75张正图片 20 { 21 sprintf(path, "C:\\Users\\Administrator\\Desktop\\a\\%d.jpg", num); 22 img_input = imread(path, -1); 23 p = img_input.reshape(1, 1); 24 p.convertTo(p, CV_32FC1); 25 combineMat.push_back(p); 26 num++; 27 } 28 29 num = 1; 30 while (num <3) //1-120张负图片 31 { 32 sprintf(path, "C:\\Users\\Administrator\\Desktop\\b\\%d.jpg", num); 33 img_input = imread(path, -1); 34 p = img_input.reshape(1, 1); 35 p.convertTo(p, CV_32FC1); 36 combineMat.push_back(p); 37 num++; 38 } 39 fs << "TrainingData" << combineMat; 40 41 Mat label(195, 1, CV_32FC1); 42 for (int i = 0; i<label.rows; ++i) 43 { 44 if (i < 75) 45 label.at<float>(i, 0) = 1.0; 46 else 47 label.at<float>(i, 0) = -1.0; 48 } 49 fs << "classes" << label; 50 fs.release(); 51 52 53 return 0; 54 }