opencv基于颜色的物体识别

#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




猜你喜欢

转载自blog.csdn.net/oliverkingli/article/details/80679459