OpenCV基本函数操作作业

1.创建一个100*100的两维三通道矩阵,初始值为全0

a.使用cv::circle在矩阵中画一个圆;

b.显示这个图片。


	Mat src3 = Mat(100,100,CV_8UC3, Scalar::all(0));
	Point pt(50, 50);

	circle(src3, pt, 40, Scalar(0, 255, 0));
	imshow("1", src3);
	waitKey(0);

                                                                 

2.创建一个100*100的两维三通道矩阵,初始值为全0

a.使用at<>这种遍历方式,画一个由(20,5)(40,20)的绿色矩形

b.显示这个图片。

y在20-40之间,x在5-20之间。

 

Mat m1 = Mat(100, 100, CV_8UC3, Scalar(0));
for (int i = 0; i < m1.rows; i++)
{
	for (int j = 0; j < m1.cols; j++)
	{
		if (j >= 20 && j <= 40 && i >= 5 && i <= 20)
		{
			m1.at<Vec3b>(j, i)[0] = 0;
			m1.at<Vec3b>(j, i)[1] = 255;
			m1.at<Vec3b>(j, i)[2] = 0;
		}
	}
}
imshow("execrise 2", m1);
waitKey();
return 0;

                                                                         

3、第二题同样的效果,但是使用指针方式

Mat m1 = Mat(100, 100, CV_8UC3, Scalar(0));
for (int i = 0; i < m1.rows; i++)

{
	uchar *outData = m1.ptr<uchar>(i);

	for (int j = 0; j < m1.cols; j++)
	{
		if (j >= 20 && j <= 40 && i >= 5 && i <= 20)
		{
			outData[j*3+1] = 255;
		}
	}
}
imshow("execrise 3", m1);

waitKey();
return 0;

                                                                       

4、练习使用ROI。创建一个210*210的单通道图像。使用ROIsetto方法,由边缘到中间,使得图像的值分别为02040……200。每一层都为10像素宽;

setTo函数

   Mat& setTo(InputArray value, InputArray mask=noArray()); 

把矩阵mask中元素不为0的点全部变为value值,是0保持不变;

Mat m1 = Mat(210, 210, CV_8U, Scalar(0));
for (int i = 0; i < 105; i=i+10)

{
	Mat roi = m1(Rect(i, i, 210 - i * 2, 210 - i * 2));
		roi.setTo(i * 2);
	
}
imshow("execrise 4", m1);

waitKey();
return 0;

                                                                

5、练习使用ROI。创建一个100*100的单通道图像,分别为(5,10)(50,60)选择一块(20*30)的区域,并进行bitwise_not运算,观察结果

Mat m1 = Mat(100, 100, CV_8U, Scalar(0));
Mat roi1 = m1(Rect(5, 10, 20, 30));
Mat roi2 = m1(Rect(50, 60, 20, 30));
bitwise_not(roi1, roi1);
bitwise_not(roi2, roi2);

imshow("execrise 5", m1);
waitKey();
return 0;

                                           

6、练习使用cv::compare()。读入lena.jpg,使用cv::split()将其区分为3个通道

a.显示绿色通道

b.将绿通道克隆两次 clone1 clone2

c.寻找到绿通道最大最小值

d.设置clone1的值为 thresh = (unsigned char)((maximum - minimum)/2.0)

e.设置clone20,并使用 cv::compare  (green_image,  clone1,  clone2,cv::CMP_GE)。这个时候clone2获得的是什么结果?

f. cv::subtract(green_image,thresh/2,green_image,clone2),显示最终结果

 

Mat clone1, clone2;
vector<Mat>bgr_planes;
Mat src = imread("lena.jpg", 1);
split(src, bgr_planes);
Mat green = bgr_planes[1];
imshow("green", green);
clone1 = green.clone();
clone2 = green.clone();

double minPixelValue, maxPixelValue;
int minPixelID, maxPixelID;
minMaxIdx(green, &minPixelValue, &maxPixelValue, &minPixelID, &maxPixelID);
double thresh = (unsigned char)((maxPixelValue - minPixelValue) / 2.0);
int ithresh = (int)thresh;
clone1 = Mat(clone1.size(), clone1.type(), Scalar(ithresh));
clone2 = Mat(clone2.size(), clone2.type(), Scalar(0));
compare(green, clone1, clone2, CMP_GE);

subtract(green, thresh / 2, green, clone2);
imshow("execrise 6", clone2);
waitKey();
return 0;

                                           

Mat src = imread("lena.jpg", 1);

                                           

                                                                       src

clone1 = green.clone();

                                               

                                                                        clone1

clone1 = Mat(clone1.size(), clone1.type(), Scalar(ithresh));

                                             

                                                                    clone1

clone2 = Mat(clone2.size(), clone2.type(), Scalar(0));

                                             

                                                                 clone2  

compare(green, clone1, clone2, CMP_GE);

                                              

                                                                    clone2

subtract(green, thresh / 2, green, clone2);

                                          

                                                                   green,       

 

题目1a.读取lena.jpg

b.别以(250,250)(350,350)为中心,绘制两个径为150的红色圆;

c.(250,250)(350,350)绘制一条红色直线

d.任意位置,puttext 大写“LOVE”红色

           

Mat src = imread("lena.jpg", 1);
circle(src, Point(250, 250), 150, Scalar(0, 0, 255), 5);
circle(src, Point(350, 250), 150, Scalar(0, 0, 255), 5);
line(src, Point(250, 250), Point(350, 250), Scalar(0, 0, 255), 5);
putText(src, "LOVE", Point(50, 30), CV_FONT_HERSHEY_DUPLEX, 1.0f, Scalar(0, 0, 255));

imshow("execrise 5", src);
waitKey();
return 0;

                                                 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值