OpenCv分区域识别图像的白色像素数量

来源:互联网 发布:js使用aes加密 编辑:程序博客网 时间:2024/05/15 02:06

希望大家学会分享,你懂得别人未必懂,大家一起学习。

效果图:


因为我的图片是提前中值化处理过的,所以效果比较好,该代码里的中值化对图片处理的不够好。

代码如下:

#include "stdafx.h"
#include <opencv2/opencv.hpp>
//#include <opencv2/imgproc/imgproc.hpp>
//#include <opencv2/core/core.hpp>
//#include <opencv2/highgui/highgui.hpp>
#include <iostream>


using namespace cv;
using namespace std;


void countTwoArea(const Mat&img, int *R, int *L)//分左右两个区域统计像素数量
{
int w = img.cols/2, h = img.rows;
*L = *R = 0;
int i, j;//外循环从左向右扫描图片,内循环从上往下扫描
for(i = 0; i < w; i++)
{
for(j = 0; j < h; j++)
{
if(img.at<uchar>(j,i) > 50)
(*R)++;
}
}
for(i = w; i < 2*w; i++)
{
for(j = 0; j < h; j++)
{
if(img.at<uchar>(j,i) > 50)
(*L)++;
}
}
}
int main()
{
Mat src = imread("10.png");
Mat tmp, dst;
cvtColor(src,tmp,COLOR_BGR2GRAY);
threshold(tmp,dst,60,255,0);
imshow("heibai",dst);
int lc = 0, rc = 0;
countTwoArea(dst,&rc,&lc);
cout << "right pixel:" << rc << "\t left pixel:" << lc <<endl;
/*if(lc < 3500 || rc < 3500)//要用到这些判断的话请根据实际情况填写
cout << "front" <<endl;
else if(rc > lc)
{
r = rc/lc;
cout << "right\t" <<endl;
}
else if(lc > rc)
{
cout << "left\t" <<endl;
}*/
waitKey(0);
return 0;
}
/*double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
第一个参数,InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。
第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。
第三个参数,double类型的thresh,阈值的具体值。
第四个参数,double类型的maxval,当第五个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值.
第五个参数,int类型的type,阈值类型,。
其它参数很好理解,我们来看看第五个参数,第五参数有以下几种类型
0: THRESH_BINARY  当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
4: THRESH_TOZERO_INV  当前点值大于阈值时,设置为0,否则不改变
*/


原创粉丝点击