#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>
#include "cvaux.h"
#include <fstream>
#include <string>
#include "GLCM.h"<span style="color:#009900;">
using namespace std;
using namespace cv;
Mat src1;
Mat draw_image;
int numb = 0;//the number in one classify
int image_num = 1;
int main (int argc , char **argv)
{
//文件读取
string ImgName;
ifstream fin("filename.txt");
ofstream myfile;
myfile.open("shuidao2.csv");// Input file
myfile << ",BAVG,GAVG,RAVG,HAVG,SAVG,VAVG,energy,entropy,contrast,idMoment,hzbi,area,perimeter,width,height,circile\n";
while (getline(fin, ImgName))
{
ImgName = "E:\\save_img\\" + ImgName;
src1 = imread(ImgName);//读取图片
//src1 = imread("E:/picture/shuidao2.jpg");
if (!src1.data)
{
cout << "Can not find the image" << endl;
}
imshow("Input image", src1);
Mat blur_img;//没用
GaussianBlur(src1, blur_img, Size(3, 3), 3, 3);
Mat bin_img;
Mat gray_img;
cvtColor(src1, gray_img, COLOR_BGR2GRAY);
threshold(gray_img, bin_img, 0, 225, THRESH_BINARY_INV | THRESH_TRIANGLE);
Mat morph_img;
Mat kernerl = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(bin_img, morph_img, MORPH_OPEN, kernerl, Point(-1, -1));
imshow("bin image", bin_img);
//imshow("Morph image", morph_img);
//Mat draw_image;
cvtColor(morph_img, draw_image, COLOR_GRAY2BGR);
Rect ROI;
vector<vector<Point>> contours;
vector<Vec4i> hiearachy;
findContours(morph_img, contours, hiearachy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
cout << "图中一共有" << contours.size() << "个水稻样本" << endl;
//ofstream myfile;
//myfile.open("shuidao2.csv");// Input file
//myfile << ",BAVG,GAVG,RAVG,HAVG,SAVG,VAVG,energy,entropy,contrast,idMoment,hzbi,area,perimeter,width,height,circile\n";
for (int t = 0; t < contours.size(); t++)
{
drawContours(draw_image, contours, t, Scalar(0, 255, 0), 2, LINE_AA);
Rect minrect = boundingRect(contours[t]);
Point2f pts[4];
ROI = minrect;
float hzbi;
hzbi = float(minrect.height) / float(minrect.width);
float area = contourArea(contours[t]);
float perimeter = arcLength(contours[t], true);
float heit = float(minrect.height);
float wih = float(minrect.width);
// min circle
Point2f center;
float radius;
minEnclosingCircle(contours[t], center, radius);
float circle_area, circle_result;
circle_area = CV_PI * radius*radius;
circle_result = area / circle_area;
//计算每个roi区域的BGR
Mat roi_img = src1(minrect);
imshow("result", roi_img);
//bgr avage
//CvMat cvmat = roi_img;
IplImage roi_imgI = roi_img;
CvScalar cs = cvAvg(&roi_imgI, NULL);
cout << t << "号水稻B通道均值: " << cs.val[0] << endl;
cout << t << "号水稻G通道均值: " << cs.val[1] << endl;
cout << t << "号水稻R通道均值: " << cs.val[2] << endl;
//hsv avge;
Mat roi_hsi;
cvtColor(roi_img, roi_hsi, COLOR_BGR2HSV);
IplImage roi_hsiI = roi_hsi;
CvScalar cs2 = cvAvg(&roi_hsiI, NULL);
cout << t << "号水稻H通道均值: " << cs2.val[0] << endl;
cout << t << "号水稻S通道均值: " << cs2.val[1] << endl;
cout << t << "号水稻V通道均值: " << cs2.val[2] << endl;
//计算每个ROI的纹理
Mat gray_roi;
cvtColor(roi_img, gray_roi, COLOR_BGR2GRAY);
IplImage gray_roiI = gray_roi;
//IplImage* img = cvLoadImage("E:/picture/shuidao2.jpg", 0);
IplImage* img = &gray_roiI;
GLCM glcm;
VecGLCM vec;
GLCMFeatures features;
glcm.initGLCM(vec);
// 水平
glcm.calGLCM(img, vec, GLCM::GLCM_HORIZATION);
glcm.getGLCMFeatures(vec, features);
// 垂直
glcm.calGLCM(img, vec, GLCM::GLCM_VERTICAL);
glcm.getGLCMFeatures(vec, features);
// 45 度
glcm.calGLCM(img, vec, GLCM::GLCM_ANGLE45);
glcm.getGLCMFeatures(vec, features);
// 135 度
glcm.calGLCM(img, vec, GLCM::GLCM_ANGLE135);
glcm.getGLCMFeatures(vec, features);
cout << "energy : " << features.energy << endl;
cout << "entropy: " << features.entropy << endl;
cout << "contrast: " << features.contrast << endl;
cout << "idMoment: " << features.idMoment << endl;
//
cout << t << "号水稻的横纵比: " << hzbi << endl;
cout << t << "号水稻的面积: " << area << endl;
cout << t << "号水稻的周长: " << perimeter << endl;
cout << t << "号水稻的宽度: " << wih << endl;
cout << t << "号水稻的长度: " << heit << endl;
cout << t << "号水稻的圆度: " << circle_result << endl;
cout << endl;
cout << endl;
int sum = 0;
sum = 9 * numb+t;
//文件写入
myfile <<"A种" << sum << "号" << "," << cs.val[0] << "," << cs.val[1] << "," << cs.val[2] << "," << cs2.val[0] << "," << cs2.val[1] << "," << cs2.val[2] << ",";
myfile << features.energy << "," << features.entropy << "," << features.contrast << "," << features.idMoment << ",";
myfile << hzbi << "," << area << "," << perimeter << "," << wih << ",";
myfile << heit << "," << circle_result << ",\n";
}
if (numb < 6)
numb++;
}
myfile.close();
imshow("Output image", draw_image);
waitKey(0);
return 0;
}