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的单通道图像。使用ROI和setto方法,由边缘到中间,使得图像的值分别为0,20,40,……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;