C++ 从opencv矩阵帧将数据从矩阵转换为数组

C++ 从opencv矩阵帧将数据从矩阵转换为数组,c++,arrays,image,opencv,matrix,C++,Arrays,Image,Opencv,Matrix,我想从420视频格式的opencv矩阵帧中提取数据。420格式意味着按原样读取第一个通道,即完整的第一个通道。对于以读取交替行和列的方式读取的帧内第二和第三通道,即对于第二通道,我们将读取像素(0,0),然后(0,2),然后(0,4)。。。。。。。(2,0)然后(2,2)等等 我已经写了代码,但我得到的阅读和写作违反是随机的。我不知道为什么 数组大小为行x列x 1.5。。。。。。1.5因为第二个和第三个通道的尺寸减小到四分之一 代码是 VideoCapture cap(readFile)

我想从420视频格式的opencv矩阵帧中提取数据。420格式意味着按原样读取第一个通道,即完整的第一个通道。对于以读取交替行和列的方式读取的帧内第二和第三通道,即对于第二通道,我们将读取像素(0,0),然后(0,2),然后(0,4)。。。。。。。(2,0)然后(2,2)等等

我已经写了代码,但我得到的阅读和写作违反是随机的。我不知道为什么

数组大小为行x列x 1.5。。。。。。1.5因为第二个和第三个通道的尺寸减小到四分之一

代码是

    VideoCapture cap(readFile);
    if (!cap.isOpened()) {
            
            cout << "Error opening video stream or file" << endl;
            
            return -1;
            
    }
    
    int arraySize = 640 * 824 * 1.5;
    uchar * arr = new uchar(arraySize);
    int frame_width = cap.get(CAP_PROP_FRAME_WIDTH);
    int frame_height = cap.get(CAP_PROP_FRAME_HEIGHT);
    int fps = cap.get(CAP_PROP_FPS);
    Size S = Size(frame_width, frame_height); // Declare Size structure
    int fourcc = VideoWriter::fourcc('H', '2', '6', '5');
    //int fourcc = VideoWriter::fourcc(*"hvc1");
    outputVideo.open(saveFile, fourcc, fps, S);
    while (1)
    {
        Mat framergb;
        Mat frame = framergb.clone();
        cap >> framergb;

        
        cvtColor(framergb, frame, 83);
        std::cout << "Channels = " << frame.channels() << endl;



        std::vector<uchar> array(framergb.rows*framergb.cols*framergb.channels());

        
        if (type == "420")
        {
            Mat rgbchannel[3];
            cv::split(frame, rgbchannel);
            //arr = new uchar(int(frame.rows*frame.cols*1.5));
//          int size = *(&arr + 1) - arr;
            cout << "Array Size = " << sizeof(arr);// << " and " << size << endl;
            int arrInd = 0;
            uchar chr = 0;
            for (int ch = 0; ch < 3; ch++)
            {
                if (ch == 0)
                {
                    for (int r = 0; r < frame.rows; r++)
                    {
                        for (int c = 0; c < frame.cols; c++)
                        {
                            chr  = rgbchannel[ch].at<uchar>(r, c);
                            arr[arrInd++] = chr;
                            cout << "cg = " << ch << ", r = " << r << ", c= " << c <<"ch = " << chr<< endl;
                            //if (c == 638)
                                //cout << "Stop";
                        }
                        //cout << "cg = " << ch << ", r = " << r <<endl;
                    }
                    cout << "cg = " << ch << endl;
                }                       
                else
                {
                    for (int r = 0; r < frame.rows; r+=2)
                    {
                        for (int c = 0; r < frame.cols; c+=2)
                        {
                            arr[arrInd++] = rgbchannel[ch].at<uchar>(r, c);
                        }
                    }
                }
            }
        }
    }

videocap(读取文件);
如果(!cap.isOpened()){
cout-framergb;
cvtColor(framergb,frame,83);

std::cout崩溃是由读取超出范围引起的

arr[arrInd++] = chr;
因为排队

uchar * arr = new uchar(arraySize);

您只分配一个字节。它应该是:
uchar*arr=new-uchar[arraySize];
-创建动态数组的方法。

这里有一个输入错误
int c=0;r
。此外,您应该将
ch
强制转换为int,或者如果希望看到范围内的整数值(0255),则将其转换为short而不是此ASCII码编码的字符。是的,这是输入错误,但它不会进入第二个通道。它在第一个通道的随机位置出现读取冲突错误此
uchar*arr=new-uchar(arraySize);
分配一个字节,您要创建数组,所以它应该是:
uchar*arr=new-uchar[arraySize]
,现在您在这里读到了越界的内容
arr[arrInd++]=chr;
@rafix07非常感谢。我犯了一个愚蠢的错误。请将此作为答案写下来,这样我就可以接受答案并对其进行投票。