在图片上实现自定义字符显示
利用openCV提供的Mat
数据类型,定义并初始化一张500×500的图片,实现以下要求:
- 根据控制台的输入,在图片中显示字符的ASCII码
- 当输入指定字符时(比如
#
),结束输入过程 - 能够满足回车和换行的要求
- 能够通过控制台输入调整图片的背景色
根据以上要求,利用c++的实现代码如下所示:
#include<iostream>
#include<vector>
#include<opencv2/opencv.hpp>
#include<string>
using namespace std;
const int HEIGHT = 500;
const int WIDTH = 500;
cv::Mat createImage(const string& color);
int main(int argc, char* argv[])
{
int posx = 20;
int posy = 25;
cv::Mat m = createImage(argv[1]);
char c;
while ((c = getchar()) != '#')
{
if(posx<=500 && posy<=500)
{
if ((c == ' '))
{
posx += 20;
}
else if ((c == '\n'))
{
posx = 20;
posy += 25;
}
else
{
cv::putText(m, to_string(c), cv::Point(posx, posy), cv::FONT_HERSHEY_DUPLEX, 1, cv::Scalar(0, 255, 0), 1, false);
posx = posx + 40;
}
}
}
cv::imshow("Image", m);
cv::waitKey(0);
return 0;
}
cv::Mat createImage(const string& color)
{
cv::Mat m;
m.create(HEIGHT, WIDTH, CV_8UC3);
//m.setTo(cv::Scalar(100, 10, 30));
if (color== "green")
{
m.setTo(cv::Scalar(0, 128, 0));
}
else if (color == "gray")
{
m.setTo(cv::Scalar(128, 128, 128));
}
else if (color == "red")
{
m.setTo(cv::Scalar(255, 0, 0));
}
else if (color == "black")
{
m.setTo(cv::Scalar(0, 0, 0));
}
else if (color == "yellow")
{
m.setTo(cv::Scalar(255, 255, 0));
}
else
{
cout << "参数错误,请重新输入!" << endl;
}
return m;
}
实现效果,如下图是所示,在cmd中运行程序,提供参数为black
,设置背景颜色为黑色,接着输入字符,当遇到#
时,结束输入,显示图片。
矩阵的"积分"
利用Mat
数据和Rect
数据实现一个矩阵的积分,具体要求如下:
- 定义一个uchar类型的单通道矩阵A,大小为200×100,用0-2的随机数初始化矩阵
- 定义一个float类型的的单通道矩阵B,大小为200×100,初始化为0
- 以左上角的
(0,0)
为坐标原点,计算从矩阵A从原点开始,到当前坐标(i,j)
所确定的范围的所有元素之和,并将其赋值给矩阵B中点(i,j)
的所确定的坐标。
基本原理如下图所示:
综上,C++
的实现代码如下图所示:
#include<iostream>
#include<opencv2/opencv.hpp>
#include<vector>
const int HEIGHT = 100;
const int WIDTH = 200;
using namespace cv;
int main()
{
// 用随机数创建一个100×200的单通道图像uchar 矩阵
system("color 0a");
Mat mu(HEIGHT, WIDTH, CV_8UC1);
RNG rnger(getTickCount());
randu(mu, Scalar::all(0), Scalar::all(3));
// 创建一个全是0的矩阵
Mat mz;
mz.create(HEIGHT, WIDTH, CV_32FC1);
mz.setTo(Scalar::all(0));
//imshow("image", mz);
//waitKey(0);
int count = 0;
//用rect 求取uchar矩阵的积分,填充到float型的矩阵
//Rect r(0, 0, 0, 0);
std::vector<float> rowValue;
std::vector<std::vector<float>> colValue;
for (int i = 1; i <= HEIGHT; i++)
{
for (int j = 1; j <= WIDTH; j++)
{
mz.at<float>(i-1, j-1) = (float)(sum(mu(Rect(0, 0, j, i))))[0];
}
}
std::cout << mz << std::endl;
/*Mat mt = Mat(mu, Rect(0, 0, 2, 2));
std::cout << mt << std::endl;
std::cout << sum(mt)[0] << std::endl;*/
return 0;
}
打印出最后一行,效果如下所示:
网友评论