OpenCV基础篇之画图及RNG随机数对象

程序及分析

/*
 * FileName : random_gen.c
 * Author   : xiahouzuoxin @163.com
 * Version  : v1.0
 * Date     : Tue 29 Jul 2014 08:31:41 PM CST
 * Brief    :
 *
 * Copyright (C) MICL,USTB
 */
#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace std;
using namespace cv;

const char wndname[] = "Drawing";
const int RAND_N = 100;

void help(void)
{
    cout<<"Usage:./drawing"<<endl;
}

static Scalar random_color(RNG& rng)
{
    int icolor = (unsigned)rng;

    return Scalar(icolor&0xFF, (icolor>>8)&0xFF, (icolor>>16)&0xFF);
}

int main(int argc, char *argv[])
{
    int line_type = CV_AA;
    int i = 0;
    int width = 1000;
    int height = 700;
    int x1 = -width/2;
    int x2 = width*3/2;
    int y1 = -height/2;
    int y2 = height*3/2;
    const int DELAY = 10;

    RNG rng(0xFFFFFFFF);
    Mat image = Mat::zeros(height, width, CV_8UC3);

    imshow(wndname, image);
    waitKey(DELAY);

    for (i=0; i<RAND_N; i++) {
        Point pt1;
        Point pt2;

        pt1.x = rng.uniform(x1, x2);
        pt1.y = rng.uniform(y1, y2);
        pt2.x = rng.uniform(x1, x2);
        pt2.y = rng.uniform(y1, y2);

        line(image, pt1, pt2, random_color(rng), rng.uniform(1,5), line_type);
    }
    imshow(wndname, image);
    waitKey(0);

    for (i=0; i<RAND_N; i++) {
    Point org;
    org.x = rng.uniform(x1, x2);
    org.y = rng.uniform(y1, y2);
    putText(image, "OpenCV",org, rng.uniform(0,8),rng.uniform(0,10)*0.5+0.1,
            random_color(rng), rng.uniform(1, 10), line_type);
    }

    imshow(wndname, image);
    waitKey(0);
    return 0;
}
  1. RNG是OpenCV中的随机数生成类,其定义在core.hpp中,

    class CV_EXPORTS RNG
    {
    public:
        enum { UNIFORM=0, NORMAL=1 };
    
        RNG();
        RNG(uint64 _state);
        //! updates the state and returns the next 32-bit unsigned integer random number
        unsigned next();
    
        operator uchar();
        operator schar();
        operator ushort();
        operator short();
        operator unsigned();
        //! returns a random integer sampled uniformly from [0, N).
        unsigned operator()(unsigned N);
        unsigned operator ()();
        operator int();
        operator float();
        operator double();
        //! returns uniformly distributed integer random number from [a,b) range
        int uniform(int a, int b);
        //! returns uniformly distributed floating-point random number from [a,b) range
        float uniform(float a, float b);
        //! returns uniformly distributed double-precision floating-point random number from [a,b) range
        double uniform(double a, double b);
        void fill( InputOutputArray mat, int distType, InputArray a, InputArray b );
        //! returns Gaussian random variate with mean zero.
        double gaussian(double sigma);
    
        uint64 state;
    };
    

    提供了两种随机数——均匀分布(uniform)和高斯正态分布(gaussian)。

    本文使用的是随机分布,两个參数分布表示均匀分布的下限和上限。

    RNG rng(0xFFFFFFFF);中的0xFFFFFFFF表示初始的随机值。

  2. Mat矩阵初始化:
    Mat image = Mat::zeros(height, width, CV_8UC3);
    
  3. line用于绘制直线,也定义在core.hpp中,
    //! draws the line segment (pt1, pt2) in the image
    CV_EXPORTS_W void line(Mat& img, Point pt1, Point pt2, const Scalar&    color,int thickness=1, int lineType=8, int shift=0);
    

    还有其他画图函数circle、ellipse、rectangle等也也能够从core.hpp中找到原型。可用到时自行学习。

  4. putText能够将文字加入到图片中。
    //! renders text string in the image
    CV_EXPORTS_W void putText( Mat& img, const string& text, Point org,
                             int fontFace, double fontScale, Scalar color,
                             int thickness=1, int linetype=8,
                             bool bottomLeftOrigin=false );
    

    其第一个參数img就是要加入文字的图像,第二个參数就是要加入的文字(程序中是"OpenCV")

  5. 关于颜色:颜色是用RGB三通道表示的,因此上面函数中颜色參数的类型都是Scalar类型。Scalar在OpenCV中相似于向量,但其长度最大为4通道。源程序中
    Scalar(icolor&0xFF, (icolor>>8)&0xFF, (icolor>>16)&0xFF);
    

    将随机数的值取出分别作为RGB三个通道的颜色值。

效果

随机线条的效果

加入“OpenCV”文字后效果

时间: 2024-10-14 05:05:36

OpenCV基础篇之画图及RNG随机数对象的相关文章

OpenCV基础篇——视频显示

Opencv的视频显示,其实质是图片显示,只不过是连续显示不同的图片.其中如果涉及GUI,还要用多线程.现在讲自己所用的视频显示写出来供大家参考,主要涉及opencv在win32和mfc中显示视频. 一:Win32+OpenCV #include "highgui.h" int main() { const char *showwindow= "image";//窗口名字 CvCapture *capture = NULL; capture=cvCaptureFro

OpenCV基础篇——环境搭建

在开始使用opencv的时候第一步就是搭建环境,关于opencv的环境搭建其实很简单,网上也有很多,一般来说才开始学习都会搭建环境很多次,至少我是这样的.这样对问题的排除有很很大的帮助.现在就把我的搭建方式分享一下: 一.opencv+vs2010 1.opencv的获取: 最好从opencv的官网获取,也可以从opencv的官方中文论坛获取:http://wiki.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5 我使用的是opencv2.4.4版的,基本上

OpenCV基础篇之读取显示图片

程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May 2014 07:34:25 PM CST * Brief : * * Copyright (C) MICL,USTB */ #include <cv.h> #include <highgui.h> using namespace cv; using namespace std; in

OpenCV基础篇——图片显示

继上文,做好opencv的配置以后,很多时候要用的就是显示图片,后面要讲的显示视频和一些测试也是建立在显示图片的基础上的,本次将分享opencv通过win32控制台显示图片和MFC显示图片: 一:OpenCV+win32 建立好win32空文档后,添加新项cpp文件后,直接上代码: #include "highgui.h" //这个头文件很多时候都会用到,在opencv中 int main() { IplImage* img = cvLoadImage( "E:\\lena.

opencv——基础篇

一 . opencv是什么及其作用? OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法(百度百科). 鉴于本人的工作环境主要是采用python作为开发工具,故本篇博客是基于python来做的学习记录. 二 . 环境依赖和opencv包 环

OpenCV基础篇之图像的DFT频域变换

转载请注明出处:http://xiahouzuoxin.github.io/notes 程序及分析 /* * FileName : fft2.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Wed 30 Jul 2014 09:42:12 PM CST * Brief : * * Copyright (C) MICL,USTB */ #include <iostream> #include <cv.h>

OpenCV基础篇——图形图像旋转

以前在做图像处理的时候用到了图像的旋转,opencv自带的flip函数只能180度,因为需要旋转任意角度,顺时针和逆时针的情况,所以去找了些效果比较好的函数来实现.网上有的旋转函数有内存泄露的现象,现在把修改过我用过的无内存泄露的函数分享一下: 一: void cvRotate(IplImage* src,int angle) { IplImage * dst = 0; dst = cvCloneImage (src); double delte = 1.0; double factor = 1

什么是图像 -- opencv基础

opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像:而image代表着计算机中存储的图像,也代表想象中的图像. 而我们更多研究的便是image,计算机图像从广义地可分为矢量图和像素图(位图).矢量图,是由一系列计算机指令描述和记录的一幅图,一幅图可以解为一系列由点.线.面等组成的子图.像素图,则是由很多个点组成的,每个点都是由二进制数据来描述和存储其

java基础篇---I/O技术(三)

接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream).使用对象输出流输出序列化对象的步骤,有时也成序列化,而使用对象输入流读入对象的过程,有时也称为反序列化 一个对象产生之后实际上是在内存中为其开辟了一个存储空间,方便存储信息. 对象序列化就是把一个对象变成二进制的数据流的一个方法,通过对象序列化可以反驳的