美文网首页
opencv 练习之基本的数据类型

opencv 练习之基本的数据类型

作者: 此间不留白 | 来源:发表于2020-10-10 20:12 被阅读0次

在图片上实现自定义字符显示

利用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;
}




打印出最后一行,效果如下所示:


相关文章

网友评论

      本文标题:opencv 练习之基本的数据类型

      本文链接:https://www.haomeiwen.com/subject/savjpktx.html