基於opencv的logo識別

 基於opencv的logo識別

首先環境爲visual studio 2012+opencv3.2.0.  大家儘量採用此環境,opencv對於環境要求較高,環境不同會一堆報錯很難處理。

 

1、opencv安裝配置環境(此節略過後續會補充在博客)

2、開始做logo識別。一個logo大致步驟,先通過顏色區別將logo從整體環境中剝離出來。此處以美的logo做解釋;

 

 

 

 

 

 

 

 

圖一爲原圖,圖二爲經過opencv 裏的hsv變換的圖片,圖三爲針對藍色做顏色過濾。經過此部分操作即可得到logo。

3、然後針對logo部分轉爲輪廓化,進行輪廓比對識別。

 

 圖一爲過濾出來的logo黑白二值圖,圖二爲輪廓圖,圖三爲logo中字母輪廓,圖四爲用來比對的輪廓。黑色xin文字爲相似度,值越小代表相似度越高。

至此即實現logo的檢測及比對,詳細代碼如下:

// opencv.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include <opencv2/opencv.hpp>


#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
 
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;  

/*int main()  
{  
    //the path of test image
    Mat img=imread("C:\\Users\\14675\\Desktop\\掃碼槍教程\\無標題h.png"); 
    namedWindow("dog");  
    imshow("dog",img);  
    waitKey(6000); // window closed after 6000 ms
}
*/





int main()
{

	/*
	//VideoCapture cap(0);

	while (true)
	{ //Mat matSrc;
	 //cap >> matSrc;


    //Mat matSrc=imread("D://程序工程/opencv/x64/Debug/2.jpg",IMREAD_UNCHANGED);
	 
	resize(matSrc, matSrc, Size(), 0.5, 0.5);
	Mat matHsv;
	//waitKey(2000);
	cvtColor(matSrc,matHsv,COLOR_BGR2HSV);


	Mat a,b,c,d,e;
	inRange(matSrc,Scalar(0, 0, 0),Scalar(180, 255, 46),a);
	medianBlur(a,b,3);
	medianBlur(b,c,5);

	Mat element = getStructuringElement(MORPH_ELLIPSE, Size(2 * 1 + 1, 2 * 1 + 1), Point(1, 1));
	Mat element1 = getStructuringElement(MORPH_ELLIPSE, Size(2 * 3 + 1, 2 * 3 + 1), Point(3, 3));

		erode(c, d, element);//腐蝕  


 imshow("顯示灰度圖",matSrc);
 imshow("顯示灰度圖1",matHsv);
 
 int ca = waitKey(100);//按ESC則退出當前視頻
   if ((char)ca == 27)
   {
    break;
   }

	}*/
	
	//圖片初始化
	Mat matSrc=imread("D://程序工程/opencv/x64/Debug/3.jpg",IMREAD_UNCHANGED);
	Mat matSrc2=imread("D://程序工程/opencv/x64/Debug/4.jpg",IMREAD_UNCHANGED);

	//尺寸歸一化 
	resize(matSrc, matSrc, Size(300,300), 1, 1);
	resize(matSrc2, matSrc2, Size(300,300), 1, 1);
	//imshow("顯示灰度圖1",matSrc);
	//hsv通道
	Mat matHsv,matHsv2;
	cvtColor(matSrc,matHsv,COLOR_BGR2HSV);
	cvtColor(matSrc2,matHsv2,COLOR_BGR2HSV);
	//imshow("顯示灰度圖2",matHsv);
	//過濾藍色二值化
	Mat lan,lan2;
	inRange(matHsv,Scalar(35, 43, 46),Scalar(124, 255, 255),lan);
	inRange(matHsv2,Scalar(35, 43, 46),Scalar(124, 255, 255),lan2);
	imshow("顯示灰度圖3",lan);

	Mat fu,peng,fu2,peng2;
	Mat element = getStructuringElement(MORPH_ELLIPSE, Size(2 * 1 + 1, 2 * 1 + 1), Point(1, 1));
	erode(lan,fu, element);//腐蝕  
	dilate(lan, peng, element);//膨脹
	erode(lan2,fu2, element);//腐蝕  
	dilate(lan2, peng2, element);//膨脹
	peng-=fu;
	peng2-=fu2;
	
	lan=peng;
	lan2=peng2;
	imshow("形態學1",lan);
	//提取輪廓
	CvSeq *test_seqs;
	CvSeq *mode_seqs;
	vector<Vec4i> hierarchy,hierarchy2;
	vector<vector<Point>> contours,contours2;

    findContours(lan,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());//提取輪廓元素
	findContours(lan2,contours2,hierarchy2,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());//提取輪廓元素
	//繪製輪廓
	drawContours(matSrc,contours, 1, Scalar(115), 3, 8, hierarchy);
	drawContours(matSrc2,contours2,3, Scalar(115), 3, 8, hierarchy2);
	imshow("形態學2",matSrc);
	imshow("形態學對比模板",matSrc2);
	double zhixin=matchShapes(contours[1],contours2[3],CV_CONTOURS_MATCH_I3,1.0);

	

	printf("輪廓一數目:%d  輪廓二數目:%d   xin:%f",contours.size(),contours2.size(),zhixin);
	//cvMatchShapes(lan,lan2,1);

	//imshow("顯示灰度圖1",matSrc);
    //imshow("顯示灰度圖2",matSrc2);
	//Canny(lan, lan, 3, 9, 3);
	//Canny(lan2, lan2, 3, 9, 3);
	//imshow("顯示灰度圖3",lan);
   // imshow("顯示灰度圖4",lan2);
	waitKey();
}



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章