目前即将开始的一个新项目是进行字符识别,下面就使用水平投影机垂直投影的测试代码贴出,供大家参考。
#include<iostream>
#include<opencv2\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<stdio.h>
using namespace cv;
using namespace std;
vector<Mat> horizontalProjectionMat(Mat srcImg)//水平投影
{
Mat binImg;
blur(srcImg, binImg, Size(3, 3));//blur均值滤波函数,滤波核大小为3*3
threshold(binImg, binImg, 0, 255, CV_THRESH_OTSU);//threshold函数是进行图像二值化处理,使用OTSU算法确定分割阈值
int perPixelValue = 0;
int width = srcImg.cols;
int height = srcImg.rows;
int* projectValArry = new int[height];//创建一个存储每行白色像素个数的数组
memset(projectValArry, 0, height * 4);//初始化数组: 比如memset(ch,0,8),就是把数组ch前八项置为零,后面的不一定为零。
for (int col = 0; col < height; col++)//遍历每个像素点
{
for (int row = 0; row < width; row++)
{
perPixelValue = binImg.at<uchar>(col, row);//img.at<uchar>(i, j)=128这是指将灰度图的第x行,第y列的置为灰度为128的灰色(0为黑色,255为白色)
//如果是彩图,则写为ima.at<cv::Vec3b>(x, y)[0],ima.at<cv::Vec3b>(x, y)[1],ima.at<cv::Vec3b>(x, y)[2],分别表示红绿蓝(顺序不确定)三种颜色的色度
if (perPixelValue == 0)//如果是白底黑字
{
projectValArry[col]++;
}
}
}
Mat