1. 程式人生 > 程式設計 >opencv3/C++基於顏色的目標跟蹤方式

opencv3/C++基於顏色的目標跟蹤方式

inRange函式

void inRange(InputArray src,InputArray lowerb,InputArray upperb,OutputArray dst);

src:輸入影象;

lowerb:下邊界陣列,閾值下限;

upperb:上邊界陣列,閾值上限;

dst:輸出影象;

顏色範圍如圖:

示例:

捕獲攝像頭中的黃色方塊

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
	VideoCapture capture;
	capture.open(0);
	if(!capture.isOpened())
	{
		printf("can not open video file  \n");
		return -1;
	}
	Mat frame,dst;
	Mat kernel;
	//開操作處理
	kernel = getStructuringElement(MORPH_RECT,Size(5,5));

	namedWindow("input",CV_WINDOW_AUTOSIZE);
	namedWindow("output",CV_WINDOW_AUTOSIZE);
	std::vector<std::vector<Point>> contours;
	std::vector<Vec4i> hireachy;
	Rect rect;
	Point2f center;
	float radius=20;

	while (capture.read(frame))
	{	
		//blur(frame,dst,5));
		inRange(frame,Scalar(0,80,80),Scalar(50,255,255),dst);
		//開操作
		morphologyEx(dst,MORPH_OPEN,kernel);
		//獲取邊界
		findContours(dst,contours,hireachy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point(0,0));
		//框選面積最大的邊界
		if (contours.size() > 0)
		{
			double maxArea=0;
			for (int i = 0; i < contours.size(); i++)
			{
				double area = contourArea(contours[static_cast<int>(i)]);
				if (area > maxArea)
				{
					maxArea = area;
					rect = boundingRect(contours[static_cast<int>(i)]);
					minEnclosingCircle(contours[static_cast<int>(i)],center,radius);
				}
			}
		}
		//矩形框
		//rectangle(frame,rect,0),2);
		//圓形框
		circle(frame,Point(center.x,center.y),(int)radius,2);
		imshow("input",frame);
		imshow("output",dst);

		waitKey(100);
	}

	capture.release();
	return 0;
}

關於顏色範圍的選取:

有朋友問顏色範圍的事,比如我們選擇某個偏紅色的範圍,如色環圖中這個區間即BGR(0,128,255)到BGR(255,213);則B、G、R這三個通道的範圍分別為0-255,0-128,213-255。因此閾值下限lowerb=Scalar(0,213),閾值上限upperb=Scalar(255,255)。

以上這篇opencv3/C++基於顏色的目標跟蹤方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。