2012-09-16 125 views
1

大家好!所以目前我正在開發一個視頻處理項目,所以我決定嘗試OpenCV。由於我是新手,我決定找幾個樣本代碼並對它們進行測試。第一個,是C OpenCV的,看起來像這樣:C/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

+0

的可能的複製引用[OpenCV的圖像處理 - C++對C VS的Python(http://stackoverflow.com/q/2278228/11343) – CharlesB

+0

懇求向我們展示導致異常的代碼。 –

+0

@Seckin Savasci,當我取消註釋'//imwrite("test1.jpg「,frame);'line,它會引起異常。 – Monceber

回答

2

還是有必要使用C++ OpenCV的?

沒有,沒有必要任何責任。你可以使用你喜歡的任何接口,並且你認爲它很好(OpenCV提供C,C++,Python接口)。

你對imwrite()imread()問題:

對於彩色圖像的順序通道正常藍,綠,紅,這 是什麼imshow(),imread()和imwrite()預計

there

+0

但這裏的問題是,它根本不寫或讀圖像,但正確顯示它們。如果圖像已保存,但未正確顯示,則會出現顏色通道問題。我應該如何改變圖像的顏色通道的順序,如果它已經被加載了嗎? – Monceber

+0

@Monceber你怎麼知道它顯示正確? –

+0

我剛剛嘗試在保存之前將圖像從BGR轉換爲RGB,使用'cvtColor(frame,edges,CV_BGR2RGB);',但異常仍然存在( – Monceber