opencv 练习之基本的数据类型

2020-10-10  本文已影响0人  此间不留白

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

利用openCV提供的Mat数据类型,定义并初始化一张500×500的图片,实现以下要求:

根据以上要求,利用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数据实现一个矩阵的积分,具体要求如下:

基本原理如下图所示:


综上,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;
}




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


上一篇 下一篇

猜你喜欢

热点阅读