opencv 数字检查

测试图片:

code:

#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>


int main(){

	IplImage* src = NULL;
	src = cvLoadImage("C:\\Users\\zxl\\Desktop\\1.png", 1);

	if (!src){
		return -1;
	}

	IplImage* pImgGray = cvCreateImage(cvGetSize(src), 8, 1);
	cvCvtColor(src, pImgGray, CV_BGR2GRAY);
	cvThreshold(pImgGray, pImgGray, 80, 255, CV_THRESH_BINARY_INV);
	IplConvKernel* element1 = cvCreateStructuringElementEx(3,1,1,0,CV_SHAPE_RECT,0);
	cvErode(pImgGray, pImgGray, element1, 1);
	cvDilate(pImgGray, pImgGray, element1, 1);
	IplConvKernel* element2 = cvCreateStructuringElementEx(1,3,0,1,CV_SHAPE_RECT,0);
	cvDilate(pImgGray, pImgGray, element2, 1);
	CvMemStorage* storage = cvCreateMemStorage(0);
	CvSeq* contour = NULL;
	IplImage* pImgEdge = cvCloneImage(pImgGray);
	int count = cvFindContours(pImgEdge, storage, &contour, sizeof(CvContour), 
		CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 
	int num = 0;
	for (; contour; contour = contour->h_next){
		CvRect rect = cvBoundingRect(contour, 0);
		if ((rect.x > 30) && (rect.x+rect.width+30 < src->width) && (rect.y > 30) && (rect.y+rect.height+60 < src->height)){
		//原始图像左右两侧一段可忽略,图像下面由于写入了ww......com这里也忽略
			cvDrawContours(src, contour, CV_RGB(255,0,0), CV_RGB(255,0,0),0, 1, 8, cvPoint(0,0));
			num++;
		}
	}
	//printf("count=%d,num=%d\n", count, num);
	cvNamedWindow("imgSrc", 1);
	cvNamedWindow("imgGray", 1);
	cvShowImage("imgSrc", src);
	cvShowImage("imgGray", pImgGray);
	cvWaitKey(0);
	//cvSaveImage("contour.jpg", src);
	//cvSaveImage("binary.jpg", pImgGray);
	cvReleaseImage(&pImgEdge);
	cvReleaseStructuringElement(&element2);
	cvReleaseStructuringElement(&element1);
	cvDestroyAllWindows();
	cvReleaseImage(&pImgGray);
	cvReleaseImage(&src);
	return 0;
}


 

 

您可以使用OpenCV库来进行数字识别和矩形框的绘制。下面是一个简单的示例代码: ```python import cv2 import numpy as np # 加载数字识别模型 model = cv2.ml.KNearest_create() model.train(np.load('train_data.npy'), cv2.ml.ROW_SAMPLE, np.load('train_labels.npy')) # 加载图像并进行预处理 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) image = cv2.GaussianBlur(image, (5, 5), 0) _, image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 查找轮廓 contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历每个轮廓 for contour in contours: # 计算轮廓的边界框 x, y, w, h = cv2.boundingRect(contour) # 确保边界框的宽度和高度合适 if w > 10 and h > 10: # 提取数字区域并调整大小 digit = image[y:y+h, x:x+w] digit = cv2.resize(digit, (28, 28)) digit = np.float32(digit.reshape(-1, 784)) # 使用模型进行预测 _, result, _, _ = model.findNearest(digit, k=1) # 在图像上绘制矩形框和识别结果 cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.putText(image, str(int(result[0][0])), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 显示结果图像 cv2.imshow('Result', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先加载了一个使用K最近邻算法训练的数字识别模型。然后,我们加载待处理的图像并进行预处理,包括灰度化、高斯模糊和二值化。接下来,我们使用`findContours`函数找到图像中的轮廓。对于每个轮廓,我们计算边界框并检查其宽度和高度是否合适。然后,我们提取数字区域并调整大小,使用训练好的模型进行预测。最后,我们在原始图像上绘制矩形框和识别结果,并显示结果图像。 请注意,此示例仅提供了一个基本的数字识别和矩形框绘制的框架,您可能需要根据您的具体需求进行适当的调整和优化。此外,在运行代码之前,请确保已经准备好数字识别模型和训练数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值