2012-12-03 25 views
3

可以使用C++和C一起開發OpenCV嗎?以下是我滿足這一problem.It程序編碼與C,如果我用可以使用C++和C一起開發OpenCV

cv::Mat saveImage=cv::imread("D:\\opencvStudy\\opencv_test\\TaskDemo\\TaskDemo\\save.jpg"); 
cv::imshow("save",saveImage); 

更換

IplImage* saveImge =cvLoadImage("D:\\opencvStudy\\opencv_test\\TaskDemo\\TaskDemo\\save.jpg"); 
cvShowImage("saveimage",saveImge); 

我遇到了這個工作well.But:

未處理的異常在TaskDemo.exe中的0x75709673處:Microsoft C++異常:內存位置0x0039ea0c處的cv :: Exception例外:

以下是le程序。希望有人可以幫助我.Thanks非常

#include<opencv/cv.h> 
#include<opencv/highgui.h> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/video/tracking.hpp" 


#include <iostream> 
#include <ctype.h> 

CvPoint pt1 = cvPoint(0,0); 
CvPoint pt2 = cvPoint(0,0); 
bool is_selecting = false; 

void cvMouseCallback(int mouseEvent,int x,int y,int flags,void* param) 
{ 
switch(mouseEvent) 
{ 
case CV_EVENT_LBUTTONDOWN: 
    pt1 = cvPoint(x,y); 
    pt2 = cvPoint(x,y); 
    is_selecting = true; 
    break; 
case CV_EVENT_MOUSEMOVE: 
    if(is_selecting) 
     pt2 = cvPoint(x,y); 
    break; 
case CV_EVENT_LBUTTONUP: 
    pt2 = cvPoint(x,y); 
    is_selecting = false; 
    break; 
} 
return; 
} 

int main(int argc,char* argv[]) 
{ 
char img_path[80] = "D:\\opencvStudy\\pic\\boldt.jpg"; 
char save_path[80] = "save.jpg"; 
char* window = "img"; 

IplImage* img = cvLoadImage(img_path); 
IplImage* img_show = cvCloneImage(img); 

cvNamedWindow(window,CV_WINDOW_AUTOSIZE); 
cvSetMouseCallback(window,cvMouseCallback); 

char text[80]; 
CvFont font; 
cvInitFont(&font,CV_FONT_HERSHEY_PLAIN,1.0,1.0); 
while(true) 
{ 
    cvCopy(img,img_show); 
    cvRectangle(img_show,pt1,pt2,cvScalar(255,255,255)); 
    sprintf(text,"roi = cvRect(%d,%d,%d,%d)",pt1.x,pt1.y,std::abs(pt2.x-pt1.x),std::abs(pt2.y-pt1.y)); 
    cvPutText(img_show,text,cvPoint(10,20),&font,cvScalar(0,0,255)); 

    cvShowImage(window,img_show); 
    char key = cvWaitKey(10); 
    if (key='r') 
    { 
     cvSetImageROI(img,cvRect(pt1.x,pt1.y,std::abs(pt2.x-pt1.x),std::abs(pt2.y-pt1.y))); 
     cvSaveImage(save_path,img); 
     cvResetImageROI(img); 
     IplImage* saveImge = cvLoadImage("D:\\opencvStudy\\opencv_test\\TaskDemo\\TaskDemo\\save.jpg"); 

     cvShowImage("saveimage",saveImge); 
     //cv::Mat saveImage=cv::imread("D:\\opencvStudy\\opencv_test\\TaskDemo\\TaskDemo\\save.jpg"); 
     //cv::imshow("save",saveImage); 
    } 
    else if(key==27) 
     break; 
} 
cvReleaseImage(&img); 
cvReleaseImage(&img_show); 
return 0; 

}

更新

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/core/core.hpp" 
#include <iostream> 
#include <ctype.h> 

using namespace std; 
using namespace cv; 
cv::Point pt1=Point(0,0); 
cv::Point pt2=Point(0,0); 
bool is_selecting=false; 

static void onMouse(int mouseEvent,int x,int y,int flags,void* param) 
{ 
switch(mouseEvent) 
{ 
case CV_EVENT_LBUTTONDOWN://CV_EVENT_LBUTTONDOWN 
    pt1 = Point(x,y); 
    pt2 = Point(x,y); 
    is_selecting = true; 
    break; 
case CV_EVENT_MOUSEMOVE: 
    if(is_selecting) 
     pt2 = Point(x,y); 
    break; 
case CV_EVENT_LBUTTONUP: 
    pt2 = Point(x,y); 
    is_selecting = false; 
    break; 
} 
} 

int main() 
{ 
cv::Mat img=cv::imread("D:\\opencvStudy\\pic\\boldt.jpg"); 
cv::Mat img_show=img.clone(); 

cv::namedWindow("Task2",0); 
cv::setMouseCallback("Task2",onMouse,0); 

char text[80]; 
while(true) 
{ 
    img.copyTo(img_show); 
    cv::rectangle(img_show,pt1,pt2,cv::Scalar(255,255,255)); 
    sprintf(text,"roi = cvRect(%d,%d,%d,%d)",pt1.x,pt1.y,std::abs(pt2.x-pt1.x),std::abs(pt2.y-pt1.y)); 
    cv::putText(img_show,text,cvPoint(10,20),10,10,Scalar(0,0,255)); 
    cv::imshow("Task2",img_show); 
    char key=cv::waitKey(10); 
    if (key='r') 
    { 
     cv::Mat save=img(cv::Rect(pt1.x,pt1.y,std::abs(pt2.x-pt1.x),std::abs(pt2.y-pt1.y))); 
     cv::imwrite("save.jpg",save); 
     cv::Mat saveImage=cv::imread("D:\\opencvStudy\\opencv_test\\TaskDemo\\TaskDemo\\save.jpg"); 
     cv::imshow("save",saveImage); 
    } 
    else if(key==27) 
     break; 
} 
return 0; 

}

+0

不完全確定這一點,但你有沒有嘗試包括opencv2/core?我認爲cv :: Mat是在那裏定義的,但其他的包括可能就足夠了。無論如何,混合這兩者通常被認爲是一個糟糕的主意,你應該堅持一個或另一個。 – Chris

+1

OpenCV的C和C++接口可以一起安全地使用 - 並且它們被用於許多應用程序,甚至OpenCV示例中。所以錯誤必須在你的代碼中。 – Sam

+0

@sammy錯誤是在衝突的包括,你可以檢查我的答案的細節。 –

回答

2

問題是與衝突的頭。你不應該包括在同一時間像這樣新舊:

#include<opencv/cv.h> 
#include<opencv/highgui.h> 
#include "opencv2/highgui/highgui.hpp" 

相反,包括新的頭文件只能,像這樣:

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 

這樣做的原因是,C++頭還包括C接口。

UPDATE:

當然,如果你使用的CV ::墊則需要使用新功能這一點。

CvCopy變得CV ::副本,沒有需要cvReleaseImage,cvRectangle變得CV ::矩形,cvSetImageROI是IMG(RECT),cvPoint變得CV ::點cvRect變得CV ::矩形 cvCloneImage變得img.clone( )等等...

或者你需要一些從cv :: Mat到IplImage的轉換來使用舊的函數。 SO處理來回轉換有一些問題。

UPDATE2:

這是最好的,因爲你正在使用using namespace cv刪除所有cv::

然後檢查舊的cv前綴所遺留的函數和變量,並刪除這些前綴。 (我仍然找到一個:cvPoint)。

掛上,您正在使用char text[80]

我認爲這又是一個問題的根源。最好是將其切換到

#include <sstream> 
//... 
stringstream ss; 
ss << "Rect(" << pt1.x << ", " << ... << ")"; 
//... 
putText(img_show, ss.str(), Point(10,20), FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 255)); 

注意,字體(我用的)是不是10,而是FONT_HERSHEY_PLAIN(或其他一些FONT_不變)。

+0

我試過了,但仍然失敗,出現以下錯誤:TaskDemo.exe中的0x75709673未處理的異常:Microsoft C++異常:內存位置0x002de310處的cv :: Exception異常。 – Menghuadong

+0

您是否排除了以「

+0

查看我的更新給你更多的想法。 –

相關問題