操作较为基层,直接上代码。如有错误还请指出。
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<vector>
using namespace cv;
using namespace std;
typedef unsigned int siZe;
void YKrectangle(Mat &image, Point Start, Point End,siZe flog)
{
if(flog==0)
{
for (int i = Start.y; i <= End.y; i++)
{
for (int j = Start.x; j <= End.x; j++)
{
image.at<Vec3b>(i, j)[0] = i;
image.at<Vec3b>(i, j)[1] = j;
image.at<Vec3b>(i, j)[2] = (i+j)/2;
}
}
}
else if (flog == 1)
{
for (int i = Start.y; i <= End.y; i++)
{
for (int j = Start.x; j <= End.x; j++)
{
if (i == Start.y || i == End.y || j == Start.x || j == End.x)
{
image.at<Vec3b>(i, j)[0] = i;
image.at<Vec3b>(i, j)[1] = j;
image.at<Vec3b>(i, j)[2] = (i + j) / 2;
}
}
}
}
}
void YKcircle(Mat &image, Point heart, int ridus,siZe flog)
{
for (int i = 0; i <= image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
if(flog==0)
{
if ((j - heart.x)*(j - heart.x) + (i - heart.y)*(i - heart.y) <= ridus* ridus)
{
image.at<Vec3b>(i, j)[0] = i;
image.at<Vec3b>(i, j)[1] = j;
image.at<Vec3b>(i, j)[2] = (i + j) / 2;
}
}
else if (flog == 1)
{
if (((j - heart.x)*(j - heart.x) + (i - heart.y)*(i - heart.y) >=ridus* ridus-ridus)&&((j - heart.x)*(j - heart.x) + (i - heart.y)*(i - heart.y) <= ridus * ridus + ridus))
{
image.at<Vec3b>(i, j)[0] = i;
image.at<Vec3b>(i, j)[1] = j;
image.at<Vec3b>(i, j)[2] = (i + j) / 2;
}
}
}
}
}
int main()
{
Mat image(1024, 1024, CV_8UC3);
siZe x, y, x1, y1,flog,ridus;
cout << "请输入矩形的起点终点和标识" << endl;
cin >> x >> y >> x1 >> y1>>flog;
Point start(x,y), end(x1,y1);
YKrectangle(image, start, end, flog);
cout << "请输入圆形的圆心和半径还有标识" << endl;
cin >> x >> y >>ridus>> flog ;
Point heart(x, y);
YKcircle(image, heart, ridus,flog);
imshow("1", image);
waitKey(0);
return 0;
}