【问题标题】:C/C++ OpenCV video processingC/C++ OpenCV 视频处理
【发布时间】:2012-09-08 21:12:58
【问题描述】:

大家好!所以目前我正在做一个视频处理项目,所以我决定尝试一下 OpenCV。由于我是新手,所以我决定找一些示例代码并对其进行测试。第一个,是 C OpenCV,看起来像这样:

#include <opencv/cv.h>
#include <opencv/highgui.h>

#include <stdio.h>

int main( void ) {

CvCapture* capture = 0;
IplImage *frame = 0;

    if (!(capture = cvCaptureFromCAM(0)))
    printf("Cannot initialize camera\n");

cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE);

while (1) {

    frame = cvQueryFrame(capture);
    if (!frame)
        break;

    IplImage *temp = cvCreateImage(cvSize(frame->width/2, frame->height/2), frame->depth, frame->nChannels); // A new Image half size

    cvResize(frame, temp, CV_INTER_CUBIC); // Resize
    cvSaveImage("test.jpg", temp, 0); // Save this image
    cvShowImage("Capture", frame); // Display the frame
    cvReleaseImage(&temp);
    if (cvWaitKey(5000) == 27) // Escape key and wait, 5 sec per capture
        break;
}

cvReleaseImage(&frame);
cvReleaseCapture(&capture);

return 0;

}

所以,这个非常好用,可以很好地将图像存储到硬盘上。但是问题从下一个示例开始,它使用 C++ OpenCV:

#include "opencv2/opencv.hpp"
#include <string>

using namespace cv;

int main(int, char**)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat edges;
    //namedWindow("edges",1);
    for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        cvtColor(frame, edges, CV_RGB2XYZ);
        imshow("edges", edges);
    //imshow("edges2", frame);
    //imwrite("test1.jpg", frame);
        if(waitKey(1000) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

所以,是的,一般来说,在显示视频(图像帧)方面几乎没有变化,但是在使用 im** 函数时,会出现一些问题。

使用 cvSaveImage() 效果很好,但是当我尝试使用 imwrite() 时,会出现关于“访问冲突读取位置”的未处理异常。当我尝试加载图像时,imread() 也是如此。

那么,我想问的是,是否可以使用 C OpenCV 的大部分功能?或者是否有必要使用 C++ OpenCV。如果是,是否有解决我之前描述的问题的方法。


同样如here 所述,图像最初为 BGR 格式,因此需要进行转换。但是进行 BGR2XYZ 转换似乎会反转颜色,而 RGB2XYZ 会保留它们。例子:

images

【问题讨论】:

  • 请告诉我们导致异常的代码。
  • @Seckin Savasci,当我取消注释 //imwrite("test1.jpg", frame); 行时,会导致异常。
  • @Monceber imread() 怎么样?
  • 类似这样的东西:Mat img = imread("test.jpg");,我尝试了有扩展名和没有扩展名 - 它仍然会导致异常

标签: c++ c opencv


【解决方案1】:

还是一定要用C++ OpenCV?

不,没有任何必要。您可以使用任何您喜欢并且认为自己擅长的接口(OpenCV 提供 C、C++、Python 接口)。

关于imwrite()imread() 的问题:

对于彩色图像,顺序通道通常是 Blue, Green, Red ,这 是 imshow() 、 imread() 和 imwrite() 所期望的

引自there

【讨论】:

  • 但这里的问题是它根本不写入或读取图像,而是正确显示它们。如果图像已保存,但未正确显示,则颜色通道将出现问题。如果已经加载,我应该如何更改图像的颜色通道顺序?
  • 我刚才尝试在保存之前将图像从BGR转换为RGB,使用cvtColor(frame, edges, CV_BGR2RGB);,但异常仍然存在(
  • 在我的问题中的第二个代码 sn-p 中有两个调用(一个注释)到 imshow(),它们都将拍摄的帧输出到新窗口。
  • @Monceber BTW 你的第一次转换有问题,你应该使用 BGR2XYZ 而不是 RGB2XYZ
  • 现在我很困惑...here我已经为图像的结果做了一些截图...这是截图,所以仍然没有保存(正常是指没有任何转换的图像。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2017-07-28
  • 2017-04-07
  • 2015-08-28
  • 2012-08-30
相关资源
最近更新 更多