C++ 从opencv矩阵帧将数据从矩阵转换为数组
我想从420视频格式的opencv矩阵帧中提取数据。420格式意味着按原样读取第一个通道,即完整的第一个通道。对于以读取交替行和列的方式读取的帧内第二和第三通道,即对于第二通道,我们将读取像素(0,0),然后(0,2),然后(0,4)。。。。。。。(2,0)然后(2,2)等等 我已经写了代码,但我得到的阅读和写作违反是随机的。我不知道为什么 数组大小为行x列x 1.5。。。。。。1.5因为第二个和第三个通道的尺寸减小到四分之一 代码是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)
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非常感谢。我犯了一个愚蠢的错误。请将此作为答案写下来,这样我就可以接受答案并对其进行投票。