1、C++直线检测自己写的代码_20220325(canny算子处理后的图输入,输出直线,可用)
//1、C++直线检测自己写的代码_20220325(canny算子处理后的图输入,输出直线,可用) #include#include #include #include #include using namespace cv; using namespace std; int main(int argc, char** argv) { //cv::Scalar color; Mat src, src_gray; src = imread("C://Users//Administrator//Desktop//dawu//0001.jpg"); //读canny算子处理之后的图 cv::cvtColor(src, src_gray, CV_BGR2GRAY); //转换为单通道的灰度图 cv::Mat dst = cv::Mat(480, 640, CV_8UC1, cv::Scalar::all(0)); //创建一张黑底纯色图 for (int y = 0; y < src_gray.rows; y++) //宽rows是行, { int j = 0; for (int x = 0; x < src_gray.cols; x=x+4) //,长cols是列 { if ((src_gray.at (Point(x, y)) == 255)) { j++; } } if (j > 16) { cout << "行数为:" << y << endl; for (int x = 0; x < src_gray.cols; x++) { dst.at (Point(x, y)) = src_gray.at (Point(x, y)); } } } cv::imshow("原图", src); cv::imshow("效果图", dst); cv::waitKey(0); return 0; }
2、Opencv4_jqxxsfyl_chapter2-2.8_视频及canny算子处理过后的视频显示__可用
//2、Opencv4_jqxxsfyl_chapter2-2.8_视频及canny算子处理过后的视频显示__可用 //输入视频、图片的特定区域画框、输出像素点数 #include "opencv.hpp" #includeusing namespace cv; using namespace std; int i = 0; char image_name[25]; int main() { cv::VideoCapture cap; cap.open("E://Copy_data_20220217//aaaa.MP4"); //检测是否正常打开:成功打开时,isOpened返回ture if (!cap.isOpened()) cout << "fail toopen!" << endl; //获取整个帧数 long totalFrameNumber = cap.get(CAP_PROP_FRAME_COUNT); cout << "整个视频共" << totalFrameNumber << "帧" << endl; //获取帧率 double rate = cap.get(CAP_PROP_FPS); cout << "帧率为:" << rate << endl; int width = cap.get(cv::CAP_PROP_FRAME_WIDTH); int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT); std::cout << "cap(width,heigh):" << width << ", " << height << std::endl; //currentFrame是在循环体中控制读取到指定的帧后循环结束的变量 long currentFrame = 1; cv::Mat frame, reframe, edge_img; while (true) { cap >> frame; //此处为跳帧操作 if (currentFrame % 10 == 0) //此处为帧数间隔,修改这里就可以了 { cout << "当前帧为:第" << currentFrame << "帧" << endl; cv::resize(frame, reframe, cv::Size(640, 480)); cv::Canny(reframe, edge_img, 100, 200); int x = 130, y = 50, width = 380, height = 150; cv::Rect rect1(x, y, width, height); cv::rectangle(reframe, rect1, cv::Scalar(0, 255, 0), 2); cv::rectangle(edge_img, rect1, cv::Scalar(0, 255, 0), 2); Mat imCrop = Mat(edge_img, rect1); int iVal255 = countNonZero(imCrop); //int iVal255 = countNonZero(edge_img); cout << "白色像素点的个数为:" << iVal255 << "" << endl; cv::imshow("original", reframe); cv::imshow("edge", edge_img); sprintf(image_name, "%s%.4d%s", "C://Users//Administrator//Desktop//dawu//", ++i, ".jpg");//保存的图片名 cv::imwrite(image_name, edge_img); int c = cv::waitKey(100); //5 if (c == 30 || c == 'q' || c == 'Q') break; } currentFrame++; } return 0; }
3.1、vector_一维数据输入,找出一对石头(tdt_audition_20220322)
//3.1、vector_一维数据输入,找出一对石头(tdt_audition_20220322) #include#include using namespace std; int main() { int N,we; //N是石头个数,we是石头权值 int temp; //temp暂存某一权值的变量 int M=0; //权值不同的石头序号组数 cout << "请输入石头个数:"; cin >> N; vector array(N);//声明变长数组 //输入所有石头的权值 for (int i = 0; i < N; i++) { cout << "请输入"<> we; array[i] = we; } //显示石头序号及对应权值 cout << "石头数为"< 3.2、vector_二维数据的输入和显示
//3.2、vector_二维数据的输入和显示 #include#include using namespace std; int main() { int num1,//行数 num2;//列数 cout << "Please enter the number for row and column: " << endl; cin >> num1 >> num2; //为二维数组开辟空间 int **p = new int*[num1]; for (int i = 0; i < num1; ++i) p[i] = new int[num2]; for (int j = 0; j < num1; j++) { for (int k = 0; k < num2; k++) { p[j][k] = (j + 1)*(k + 1); cout << setw(6) << p[j][k] << ':' << setw(8) << &p[j][k]; } cout << endl; } //释放二维数组占用的空间 for (int m = 0; m < num1; m++) delete[] p[m]; delete[] p; return 0; } 4.1、Opencv4机器学习算法原理--chapter2--2.6 读取视频
//4.1、Opencv4机器学习算法原理--chapter2--2.6 读取视频 #include "opencv.hpp" #includeint i = 0; char image_name[25]; int main() { int j = 0; cv::VideoCapture cap; cap.open("C://Users//Administrator//Desktop//fog_videos//aaaa.MP4"); cv::Mat frame; for (;;) { cap >> frame; if (frame.empty()) break; //cv::imshow("Example2_3", frame); sprintf(image_name, "%s%.4d%s", "C://Users//Administrator//Desktop//dawu//", ++i, ".jpg");//保存的图片名 cv::imwrite(image_name, frame); if (cv::waitKey(33) >= 0) break; } return 0; } 4.2、Opencv视频分解成图片
//4.2、Opencv视频分解成图片 #include#include"opencv2/opencv.hpp" using namespace std; using namespace cv; void main() { VideoCapture cap("E:\Copy_data_20220217\2.11\aaaa.MP4"); long totalFrameNumber = cap.get(CAP_PROP_FRAME_COUNT); cout << "total frames: " << totalFrameNumber << endl; Mat frame; bool flags = true; long currentFrame = 0; while (flags) { //读取视频每一帧 cap.read(frame); stringstream str; str << "cqh" << currentFrame << ".jpg"; cout << "正在处理第" << currentFrame << "帧" << endl; printf("n"); if (currentFrame % 10 == 0) { imwrite("C:\Users\Administrator\Desktop\20220308\" + str.str(), frame); } if (currentFrame >= totalFrameNumber) { flags = false; } currentFrame++; } system("pause"); } 5、读文件夹下文件名(各类文件的文件名),写入txt_可用5
//5、读文件夹下文件名(各类文件的文件名),写入txt_可用5 //不同点,从txt复制到txt1,然后再修改txt1中的数据;两次写入,一次复制写入txt1、<动态>修改写入txt1 //待完善:没有把图片写到文件夹里面 #include "opencv.hpp" #include#include #include #include #include using namespace cv; using namespace std; void getFiles(string, vector &); //得到文件夹下所有的文件名,并没有写入txt中, //只是暂存在files中 void handlefiles1(vector &); //写入txt的时候,把视频文件名前缀加1写入txt中 void copyTXT(string, string); //复制filename到filename1 void ModifyLineData(string, char*); //修改filename1中的数据 void createfolder(string); //根据文件名在指定路径创建文件夹 void videotopicture1(string); //视频转换成图片 string filefolder = "E:\Copy_data_20220217"; //视频文件所处文件夹 string filename = "C:\Users\Administrator\Desktop\vid.txt"; string filename1 = "C:\Users\Administrator\Desktop\videos.txt"; string folderPath = "C:\Users\Administrator\Desktop\123"; //分解的图片所处的总文件夹 string name; //子文件夹名称 int main() { vector files; getFiles(filefolder, files); handlefiles1(files); copyTXT(filename, filename1); ModifyLineData(filename1, "0"); system("Pause"); //按任意键后退出 return 0; } void getFiles(string path, vector & files) { intptr_t hFile = 0; //文件句柄 struct _finddata_t fileinfo; //文件信息 string p; if ((hFile = _findfirst(p.assign(path).append("\*").c_str(), &fileinfo)) != -1) { do { //如果是目录,迭代之 //如果不是,加入列表 if ((fileinfo.attrib & _A_SUBDIR)) { if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) getFiles(p.assign(path).append("\").append(fileinfo.name), files); } else { files.push_back(p.assign(path).append("\").append(fileinfo.name)); } } while (_findnext(hFile, &fileinfo) == 0); _findclose(hFile); } } void handlefiles1(vector & files) { ofstream outdata; for (int j = 0; j < files.size(); ++j) { cout << files[j] << endl; outdata.open(filename, ios::app); //打开文件txt文件,ios::app是尾部追加的意思 //outdata << files[j] << endl; //把文件夹下的文件名写入到txt中 outdata << "1" << "_" << files[j] << endl; outdata.close(); //关闭文件 } } void copyTXT(string filename, string filename1) { ifstream infile(filename); ofstream outfile(filename1, ios::app); char c; while (infile.get(c)) { outfile << c; } infile.close(); outfile.close(); } void ModifyLineData(string filename1, char* lineData) { ifstream in; in.open(filename1); string strFileData = ""; int line = 1; char tmpLineData[1024] = { 0 }; while (in.getline(tmpLineData, sizeof(tmpLineData))) { //提取txt中一条视频名称的前缀1 int pos1 = string(tmpLineData).find_first_of('_'); string first = string(tmpLineData).substr(0, pos1); string leftover = string(tmpLineData).substr(pos1 + 1); bool format_ind = (first == "1"); if (format_ind) { string temp1 = string(lineData) + string("_") + string(leftover); strFileData += temp1; strFileData += "n"; } else { continue; } //写入文件 ofstream out; out.open(filename1); out.flush(); out << strFileData; out.close(); createfolder(tmpLineData); videotopicture1(leftover); line++; } in.close(); } void createfolder(string filename) { string::size_type iPos = string(filename).find_last_of('\') + 1; string tempname = string(filename).substr(iPos, string(filename).length() - iPos); name = tempname.substr(0, tempname.rfind(".")); cout << name << endl; string folderPathfloder = string(folderPath) + string("\") + string(name); string command = "mkdir " + folderPathfloder; system(command.c_str()); } void videotopicture1(string filename) //跳帧输出 { cv::VideoCapture cap; cap.open(filename); cv::Mat frame; int i = 0; char image_name[25]; //currentFrame是在循环体中控制读取到指定的帧后循环结束的变量 long currentFrame = 1; while (true) { cap >> frame; //此处为跳帧操作 if (currentFrame % 10 == 0) //此处为帧数间隔,修改这里就可以了 { cout << "当前帧为:第" << currentFrame << "帧" << endl; cv::imshow("original", frame); string filname1 = string(folderPath) + string("\") + string(name); std::cout << filname1 << std::endl; sprintf(image_name, "%s%.4d%s", filname1, ++i, ".jpg");//保存的图片名 std::cout << image_name << std::endl; cv::imwrite(image_name, frame); //cv::imwrite(filename, frame); int c = cv::waitKey(100); //5 if (c == 30 || c == 'q' || c == 'Q') break; std::cout << "Hello!" << std::endl; } currentFrame++; } }



