C++ 带约束的随机矩阵

C++ 带约束的随机矩阵,c++,opencv,random,C++,Opencv,Random,我想生成一个随机矩阵,它的元素应该只有1s或0s,我必须通过很多限制,比如: 0个数等于1个数或70%0s 30%1s 大多数0位于矩阵的角部或中心部分 0避免使用常见的模式,如对角线或矩形 其目的是给出一个像棋盘一样的图形表示,许多矩阵必须随机生成并显示给用户 因此,我使用了opencv2中的cv::Mat,这正是我在图形表示中所需要的,但它不适合随机限制;我的代码: Mat mean = Mat::zeros(1,1,CV_32FC1); Mat sigma= Mat::ones(1,1,C

我想生成一个随机矩阵,它的元素应该只有1s或0s,我必须通过很多限制,比如:

  • 0个数等于1个数或70%0s 30%1s
  • 大多数0位于矩阵的角部或中心部分
  • 0避免使用常见的模式,如对角线或矩形
  • 其目的是给出一个像棋盘一样的图形表示,许多矩阵必须随机生成并显示给用户

    因此,我使用了opencv2中的cv::Mat,这正是我在图形表示中所需要的,但它不适合随机限制;我的代码:

    Mat mean = Mat::zeros(1,1,CV_32FC1);
    Mat sigma= Mat::ones(1,1,CV_32FC1);
    Mat resized = Mat(300,300,CV_32FC3);
    Mat thr;
    lotAreaMat = Mat(lotAreaWidth,lotAreaHeight,CV_32FC3);
    randn(lotAreaMat,  mean, sigma);
    resize(lotAreaMat, resized, resized.size(), 0, 0, cv::INTER_NEAREST);
    
    Mat grey;// = resized.clone();
    cvtColor(resized,grey,CV_RGB2GRAY);
    threshold(grey,thr,0.2,255,THRESH_BINARY_INV);
    
    这里的问题是,我不知道如何定义一个随机生成器模式,一些想法


    这些矩阵的图形表示看起来像AR标记

    几乎没有机会在
    opencv
    中找到您想要的函数。您可能需要逐个访问像素并使用
    rand()

    这里是一个起点,画一个类似于随机点的圆盘:

    #include<iostream>
    #include<cmath>
    
    #include <stdio.h>      /* printf, scanf, puts, NULL */
    #include <stdlib.h>     /* srand, rand */
    #include <time.h>       /* time */
    
    #include<opencv2/imgproc/imgproc.hpp>
    #include<opencv2/highgui/highgui.hpp>
    #include <opencv2/core/core.hpp>
    using namespace std;
    using namespace cv;
    
    uchar getrandom(double probazero){
        int bla=rand();
        if(probazero*RAND_MAX>bla){
            return 0;
        }
        return 255;
    }
    
    int main()
    
    {
        srand(time(NULL));
        int sizex=420;
        int sizey=420;
        Mat A = Mat(sizex,sizey,CV_8UC1);
    
        double dx=2.0/A.cols;
        double dy=2.0/A.rows;
        double y=-dy*(A.rows*0.5);
        uchar *input = (uchar*)(A.data);
        for(int j = 0;j < A.rows;j++){
            double x=-dx*(A.cols*0.5);
            for(int i = 0;i < A.cols;i++){
                                // x*x+y*y is square of radius
                input[A.step * j + i ]=getrandom(x*x+y*y) ;
                x+=dx;
            }
            y+=dy;
        }
    
        imwrite("out.png",A );
        A.release();
    
        return 0;
    }
    
    再见


    Francis

    您想要0和1的随机分布,还是限制?您的x%和100-x%1s和0s非常简单:使用
    randu
    而不是
    randn
    将值从0设置为100,然后将所有 gcc -fPIC main3.cpp -o main3 -lopencv_highgui -lopencv_imgproc -lopencv_core -I /usr/local/include