可以同时使用C ++和C开发OpenCV吗 [英] Can OpenCV be developed using C++ and C together

查看:106
本文介绍了可以同时使用C ++和C开发OpenCV吗的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

能否同时使用C ++和C开发OpenCV?以下是我遇到此问题的程序.它是用C编写的,可以很好地工作.但是,如果我使用

Can OpenCV be developed using C++ and C together? Following is the program where i meet this problem.It is coded with C and works well.But if I use

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

我遇到了这个

TaskDemo.exe中0x75709673的未处理异常:Microsoft C ++异常:内存位置0x0039ea0c的cv :: Exception..

以下是整个程序.希望有人能帮助我.非常感谢

Following is the whole program. Hope anyone could help me .Thanks very much

#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;

}

推荐答案

问题在于标题冲突.您不应像这样同时包含新旧内容:

The problem is with conflicting headers. You should not include old and new at the same time like this:

#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接口.

The reason for this is that the C++ headers also include the C interface.

更新:

当然,如果您使用cv :: Mat,那么您还需要为此使用新功能.

Of course if you use cv::Mat then you need to use the new functions for that as well.

CvCopy变成cv :: copy,不需要cvReleaseImage,cvRectangle变成cv :: rectangle,cvSetImageROI是img(rect),cvPoint变成cv :: Point cvRect变成cv :: Rect cvCloneImage变成img.clone()等等...

CvCopy becomes cv::copy, there is no cvReleaseImage needed, cvRectangle becomes cv::rectangle, cvSetImageROI is img(rect), cvPoint becomes cv::Point cvRect becomes cv::Rect cvCloneImage becomes img.clone() and so on...

或者您需要从cv :: Mat到IplImage的转换才能使用旧功能.关于SO处理来回转换存在一些问题.

Or you need some conversion from cv::Mat to IplImage to use the old functions. There are some questions on SO dealing with converting back-and-forth.

UPDATE2:

最好删除所有cv::,因为您正在使用using namespace cv.

It is best to remove all cv:: since you are using using namespace cv.

然后检查保留有旧cv前缀的函数和变量,并删除这些前缀. (我仍然找到一个:cvPoint).

Then check for functions and variables left with the old cv prefix, and remove those prefixes. (I've still found one: cvPoint).

等一下,您正在使用char text[80]

我认为这又是问题的根源.最好将其切换到

I think that is again a source of problems. It is best to switch it to

#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_常量).

Note that the font (I use) is not 10, but FONT_HERSHEY_PLAIN (or some other FONT_ constant).

这篇关于可以同时使用C ++和C开发OpenCV吗的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆