gpt4 book ai didi

c++ - 在 OpenCV 中如何知道图像是否为 RGB?

转载 作者:搜寻专家 更新时间:2023-10-31 00:34:27 28 4
gpt4 key购买 nike

我使用 OpenCV 库用 C++ 编写了一个程序。该程序从网络摄像头录制视频,然后将其分成几帧。我想知道帧是否为 RGB,因为我想访问每个像素的 RGB 属性。捕获的编解码器是 CV_FOURCC('M','J','P','G')。如何获取 RGB 色彩空间中的帧?

int main() {

Mat image;
VideoCapture cap(0);
cap.set(CV_CAP_PROP_FPS, 10);

if ( !cap.isOpened() ) {
cout << "ERROR : Cannot open the video file"<<endl;
return -1;
}
namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);

double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH);
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
cout << "Frame size :" << dWidth << "x" << dHeight << endl;
Size frameSize(static_cast<int>(dWidth), static_cast<int>(dHeight));
VideoWriter oVideoWriter("E:/myVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 10, frameSize, true);

if (!oVideoWriter.isOpened()) {
cout << "ERROR : Failed to write the video"<<endl;
return - 1;
}

while (1) {
Mat image;
bool bSuccess = cap.read(image);

if (!bSuccess) {
cout << "ERROR : Cannot read a frame from video file" << endl;
break;
}
oVideoWriter.write(image);
imshow("MyWindow", image);

if (waitKey(10) == 27) {

saveImages();


cout << "ESC key is pressed by user" << endl;
break


}
}
return 0;
}




int saveImages() {



CvCapture *capture = cvCaptureFromFile("E:/myVideo.avi");
if(!capture)
{
cout<<"!!! cvCaptureFromAVI failed (file not found?)"<<endl;
return -1;
}

int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);


IplImage* frame = NULL;
int frame_number = 0;
char key = 0;

while (key != 'q')
{

frame = cvQueryFrame(capture);
if (!frame)
{
cout<<"!!! cvQueryFrame failed: no frame"<<endl;
break;
}

char filename[100];
strcpy(filename, "frame_");

char frame_id[30];
_itoa(frame_number, frame_id, 10);
strcat(filename, frame_id);
strcat(filename, ".jpg");

printf("* Saving: %s\n", filename);

if (!cvSaveImage(filename, frame))
{
cout<<"!!! cvSaveImage failed"<<endl;
break;
}

frame_number++;

key = cvWaitKey(1000 / fps);
}


cvReleaseCapture(&capture);

return 0;
}

最佳答案

当 OpenCV 从磁盘、相机或视频文件中加载彩色图像(即 3 channel )时,图像数据将以 BGR 格式存储。这是一个您可以执行的简单测试:

/* Code using the C++ API */

cv::VideoCapture cap(0);
if (!cap.isOpened()) {
std::cout << "!!! Failed to open webcam" << std::endl;
return -1;
}

if (!cap.read(frame)) {
std::cout << "!!! Failed to read a frame from the camera" << std::endl;
return -1;
}

bool is_colored = false;
if (frame.channels() == 3) {
is_colored = true;
}

// Do something with is_colored
// ...

除非你有一个奇怪的相机,否则帧将始终是彩色的(因此,存储为 BGR)。

cv::imwrite()(C++ API)或 cvSaveImage()(C API)被调用时,OpenCV 会使用适当的魔术来确保数据是正确的以与请求的输出格式(JPG、PNG、AVI 等)兼容的方式保存,在此过程中,如果需要,它会自动将数据转换为 RGB。

然而,如果出于某种原因你需要将图像转换为 RGB,你可以调用:

cv::Mat img_rgb;
cv::cvtColor(frame, img_rgb, CV_BGR2RGB);

请注意,OpenCV 有一个 C API 和一个 C++ API,它们不应该混用:

  • 如果您使用 IplImage,则坚持使用 C API 的其余部分。

  • 如果您决定使用 cv::Mat,请继续使用 C++ API。

There are different ways to access the pixels of a cv::Mat ,这是其中之一:

unsigned char* pixels = (unsigned char*)(frame.data);
for (int i = 0; i < frame.rows; i++)
{
for (int j = 0; j < frame.cols; j++)
{
char b = pixels[frame.step * j + i] ;
char g = pixels[frame.step * j + i + 1];
char r = pixels[frame.step * j + i + 2];
}
}

关于c++ - 在 OpenCV 中如何知道图像是否为 RGB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26059507/

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