gpt4 book ai didi

c++ - 从opencv矩阵框架将数据从矩阵转换为数组

转载 作者:行者123 更新时间:2023-12-02 17:16:30 25 4
gpt4 key购买 nike

我想从 420 视频格式的 opencv 矩阵帧中提取数据。 420 格式意味着读取第一个 channel ,即完整的第一个 channel 。对于帧中的第二个和第三个 channel ,以读取交替行和列的方式读取,即对于第二个 channel ,我们将读取像素 (0,0) 然后 (0,2) 然后 (0,4) ..... .. (2,0) 然后 (2,2) 等等...
我已经编写了代码,但是我的读写违规是随机的。我不知道为什么
数组大小是 rows x cols x 1.5 ...... 1.5 因为第二个和第三个 channel 大小减少到四分之一。
代码是

    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);
}
}
}
}
}
}

最佳答案

崩溃是由于读取越界引起的

arr[arrInd++] = chr;
因为按线
uchar * arr = new uchar(arraySize);
你只分配一个字节。应该是: uchar * arr = new uchar[arraySize]; - 创建动态数组的方式。

关于c++ - 从opencv矩阵框架将数据从矩阵转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64549021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com