基于opencv4,识别字母W(C++)

本文介绍了一种基于OpenCV4的字母W识别方法,并提供源代码实现。该方法通过加载预训练的联级分类器,从视频中检测字母W的位置,并将其标记出来。

基于opencv4,识别字母W。
先上代码:

//读取视频,捕获w,并保存视频
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui_c.h>

using namespace cv;
using namespace std;

CascadeClassifier W_cascader;
String Wfile = "H:/VS/Opencv/program/Training_data/alphabet/letter_w_2/HaarResult/cascade.xml";    //联级分类器的地址

int main(int argc, char** argv) {
	//加载分类器
	if (!W_cascader.load(Wfile)) {
		printf("could not load file...\n");
		return -1;
	}
	namedWindow("demo-win", CV_WINDOW_AUTOSIZE);


	VideoCapture capture;
	Mat frame;
	Mat gray;
	vector<Rect>faces;
	capture.open("H:/VS/vedio/W_4.mp4");    //加载视频的地址

	capture.read(frame);

	//配置视频录制
	VideoWriter writer;
	int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');  // 选择编码格式
	double fps = 25.0;  //设置视频帧率 
	string filename = "live.avi";  //保存的视频文件名称
	writer.open(filename, codec, fps, frame.size(), 1);  //创建保存视频文件的视频流

	while (capture.read(frame)) {
	cvtColor(frame, gray, COLOR_RGB2GRAY);
	equalizeHist(gray, gray);
	W_cascader.detectMultiScale(gray, faces, 1.1, 1, 0, Size(300, 300));
	for (size_t t = 0;t < faces.size();t++) {
		rectangle(frame, faces[t], Scalar(255, 0, 0), 2, 8, 0);
	}

		imshow("demo-win", frame);
		writer.write(frame);  //把图像写入视频流
		char c = waitKey(30);
		if (c == 27) { //esc
			break;
		}

	}

	//release source
	capture.release();
	waitKey(0);
	return 0;

}

代码的主要思路为,在这里插入图片描述
有效果视频呢,在下面视频的结尾!!!!
https://www.bilibili.com/video/BV1Ny4y1n7Xr/

因为训练的数据有限,暂时还不能满足一些极端情况(如旋转等)

关注并私信博主,发所有相关资料!!!

如果有帮助,记得三连哦!!

使用OpenCVC++识别字母A和B可以通过以下通用步骤实现: ### 1. 图像读取与预处理 首先读取包含字母的图像,并进行灰度化、高斯模糊、二值化等预处理操作,以提高后续识别的准确性。 ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 读取图像 cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_COLOR); if (image.empty()) { std::cout << "Could not open or find the image" << std::endl; return -1; } // 转换为灰度图像 cv::Mat gray; cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY); // 高斯模糊 cv::Mat blurred; cv::GaussianBlur(gray, blurred, cv::Size(5, 5), 0); // 二值化 cv::Mat binary; cv::threshold(blurred, binary, 127, 255, cv::THRESH_BINARY); return 0; } ``` ### 2. 轮廓检测 通过轮廓检测找出图像中字母的轮廓,以便后续对其进行特征提取和识别。 ```cpp std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; cv::findContours(binary, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); ``` ### 3. 特征提取 为了区分字母A和B,可以提取轮廓的一些特征,例如轮廓的面积、周长、形状特征等。 ```cpp for (size_t i = 0; i < contours.size(); i++) { double area = cv::contourArea(contours[i]); double perimeter = cv::arcLength(contours[i], true); // 可以根据实际情况添加更多特征提取和筛选条件 if (area > 100 && perimeter > 20) { // 对符合条件的轮廓进行进一步处理 } } ``` ### 4. 模板匹配 准备字母A和B的模板图像,通过模板匹配的方法来识别图像中的字母。 ```cpp cv::Mat templateA = cv::imread("template_A.jpg", cv::IMREAD_GRAYSCALE); cv::Mat templateB = cv::imread("template_B.jpg", cv::IMREAD_GRAYSCALE); for (size_t i = 0; i < contours.size(); i++) { cv::Rect boundingRect = cv::boundingRect(contours[i]); cv::Mat roi = binary(boundingRect); cv::Mat resultA, resultB; cv::matchTemplate(roi, templateA, resultA, cv::TM_CCOEFF_NORMED); cv::matchTemplate(roi, templateB, resultB, cv::TM_CCOEFF_NORMED); double minValA, maxValA, minValB, maxValB; cv::Point minLocA, maxLocA, minLocB, maxLocB; cv::minMaxLoc(resultA, &minValA, &maxValA, &minLocA, &maxLocA); cv::minMaxLoc(resultB, &minValB, &maxValB, &minLocB, &maxLocB); if (maxValA > maxValB && maxValA > 0.8) { std::cout << "Found letter A" << std::endl; } else if (maxValB > maxValA && maxValB > 0.8) { std::cout << "Found letter B" << std::endl; } } ``` ### 5. 机器学习方法(可选) 如果模板匹配效果不佳,可以考虑使用机器学习方法,如支持向量机(SVM)或深度学习方法(如卷积神经网络)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Orange--Lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值