栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Canny算子筛选出图片中的直线

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Canny算子筛选出图片中的直线

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"
#include 

using 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"
#include

int 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++;
	}
}



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980178.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号