#include <iostream>
#include <string>
// #include <string.h>
#include <vector>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
void process(string file, string &saveName)
{
Mat Img = imread(file, 1);
vector<Mat> channels;
split(Img, channels);
// namedWindow("Original", CV_WINDOW_NORMAL);
Mat imgHSV;
vector<Mat> hsvSplit;
cvtColor(Img, imgHSV, COLOR_BGR2HSV);
split(imgHSV, hsvSplit);
// imshow("HSV", imgHSV);
static long count = 0;
for (int i = 0; i < hsvSplit[0].rows; i++) {
//获取第i行的首地址
uchar*data = hsvSplit[0].ptr<uchar>(i);
for (int j = 0; j < hsvSplit[0].cols; j++) {
if (static_cast<int>(data[j]) < 78 || static_cast<int>(data[j]) > 157)
{
data[j] = 0;
}
}
}
Mat cannyImage;
Canny(hsvSplit[0], cannyImage, 20, 255, 3);
vector< vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(cannyImage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
for (int i = 0; i < (int)contours.size(); i++)
{
drawContours(cannyImage, contours, i, Scalar(255), 1, 0);
}
//计算轮廓的面积
double g_dConArea;
vector<Point> approx;
double g_dConArea_2;
for (int i = 0; i < (int)contours.size(); i++)
{
g_dConArea = contourArea(contours[i], true);
approxPolyDP(contours[i], approx, 1, true);
g_dConArea_2 = contourArea(approx, true);
cout << "【用轮廓面积计算函数计算出来的第" << i << "个轮廓的面积为:】" << g_dConArea << endl;
cout << "【用轮廓面积计算函数拟合出来的第" << i << "个轮廓的面积为:】" << g_dConArea_2 << endl;
}
if (abs(g_dConArea) > 1)
{
imwrite((saveName + "-B.jpg"), channels.at(0));
imwrite((saveName + "-G.jpg"), channels.at(1));
imwrite((saveName + "-R.jpg"), channels.at(2));
imwrite((saveName + "-H.jpg"), hsvSplit.at(0));
imwrite((saveName + "-S.jpg"), hsvSplit.at(0));
imwrite((saveName + "-V.jpg"), hsvSplit.at(0));
imwrite((saveName + "-cannyImage.jpg"), cannyImage);
imwrite((saveName + "-Img.jpg"), Img);
imwrite((saveName + "-HSV.jpg"), hsvSplit);
namedWindow("B", CV_WINDOW_NORMAL);
namedWindow("G", CV_WINDOW_NORMAL);
namedWindow("R", CV_WINDOW_NORMAL);
namedWindow("HSV", CV_WINDOW_NORMAL);
namedWindow("H", CV_WINDOW_NORMAL);
namedWindow("S", CV_WINDOW_NORMAL);
namedWindow("V", CV_WINDOW_NORMAL);
imshow("B", channels.at(0));
imshow("G", channels.at(1));
imshow("R", channels.at(2));
imshow("Original", Img);
imshow("H", hsvSplit.at(0));
imshow("S", hsvSplit.at(1));
imshow("V", hsvSplit.at(2));
}
cout << endl << "==================" << endl << count << endl << "=================" << endl;
if (count = (hsvSplit[0].rows * hsvSplit[0].cols))
{
cout << "Yes" << endl;
}
}
int main(int argv, char**argc)
{
/*
string file_folder = "//home//king//桌面//tmp//PTX5_";
for (int i = 22179; i <= (100 + 22179); i++)
{
string val = to_string(i);
string file_name = file_folder + val + ".jpg";
string saveName = "//home//king//桌面//tmp//result//PTX5_" + val;
process(file_name, saveName);
}
*/
string image_path = static_cast<string>(argc[1]);
string saveName = "test";
process(image_path, saveName);
waitKey(0);
// system("pause");
return 0;
}
原图
B通道
G通道
R通道
H通道
S通道
V通道
边缘检测canny