1. 程式人生 > >OpenCV——修改影象畫素(隨心所欲)

OpenCV——修改影象畫素(隨心所欲)

這一節將講述OpenCV——修改影象畫素,根據自己需要新增特定的畫素部分

原圖如下,我們就是先在這個視訊流上新增一條直線段(有一定寬度的)

現在我們想新增一條,135行-455行,列350--360的直線段

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

int main()
{
	VideoCapture capture(0);
	
	while (1)
	{
		Mat frame;
		capture >> frame;
		
	    //修改畫素,新增直線//////////////////////
		for (int i = 135; i < 455; ++i)//繪製行數
		{
			for (int j = 350; j < 360; ++j)//繪製列數
			{
				Vec3b pixel;
				pixel[0] = 0;
				pixel[1] = 0;
				pixel[2] = 255;
				frame.at<Vec3b>(i, j) = pixel;
			}
		}
		/////////////////////////////////////
		namedWindow("視訊影象");
		imshow("視訊影象", frame);
	
		waitKey(30);
	}
	return 0;

}


視訊截圖如下

現在主要講一下修改畫素部分,程式碼段如下

//修改畫素,新增直線//////////////////////
		for (int i = 135; i < 455; ++i)//繪製行數
		{
			for (int j = 350; j < 360; ++j)//繪製列數
			{
				Vec3b pixel;
				pixel[0] = 0;     //B畫素
				pixel[1] = 0;     //G畫素
				pixel[2] = 255;   //R畫素
				frame.at<Vec3b>(i, j) = pixel;  //畫素修改,講直線段部分繪製在frame影象上
			}
		}
		/////////////////////////////////////

基本修改畫素部分也就這麼些。

下面重磅來襲,講前面兩個部落格內容整個在一起。。

現在我們要在原圖上-----------ROI區域擷取-----------繪製T字標記

其中T字標準如下圖(數字是畫素範圍,恕我懶了,應該也可以看懂)
上程式碼(可直接執行)
#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
	VideoCapture capture(0);
	
	while (1)
	{
		Mat frame;
		capture >> frame;
		Mat roi = frame(Range(120, 476), Range(180, 476));
	    //修改畫素,新增直線//////////////////////
		for (int i = 155; i < 275; ++i)//繪製行數
		{
			for (int j = 144; j < 150; ++j)//繪製列數
			{
				Vec3b pixel;
				pixel[0] = 0;     //B畫素
				pixel[1] = 0;     //G畫素
				pixel[2] = 255;   //R畫素
				roi.at<Vec3b>(i, j) = pixel;  //畫素修改,講直線段部分繪製在frame影象上
			}
		}

		for (int i = 150; i < 155; ++i)//繪製行數
		{
			for (int j = 77; j < 217; ++j)//繪製列數
			{
				Vec3b pixel;
				pixel[0] = 255;
				pixel[1] = 0;
				pixel[2] = 0;
				roi.at<Vec3b>(i, j) = pixel;
			}
		}
		/////////////////////////////////////
		namedWindow("視訊影象");
		imshow("視訊影象", roi);
	
		waitKey(30);
	}
	return 0;

}

視訊截圖如下

下面,再隨心所欲一下,在任意兩點Point pt1(x1,y1);    Point pt2(x2, y2);之間繪製直線

程式碼段如下
#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
	VideoCapture capture(0);
	
	while (1)
	{
		Mat frame;
		capture >> frame;
	    //修改畫素,新增直線//////////////////////
		Point pt1(30,80);
		Point pt2(450, 480);
		line(frame, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA);
		/////////////////////////////////////
		namedWindow("視訊影象");
		imshow("視訊影象", frame);
	
		waitKey(30);
	}
	return 0;

}

1視訊截圖(寬度為1)


2視訊截圖(寬度為3)


兩點連線的程式碼段 如下
                 /////修改畫素,新增直線//////////////////////
		Point pt1(30,80);
		Point pt2(450, 480);
		line(frame, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA); 
               ///line(frame, pt1, pt2, Scalar(0, 0, 255), 3, CV_AA);
                              /////line(frame, pt1, pt2, Scalar(0, 0, 255), 10 CV_AA);
		/////////////////////////////////////

3視訊截圖(寬度為10)



OK,結束