3

C++ と C を一緒に使用して OpenCV を開発できますか? 以下は、私がこの問題に遭遇したプログラムです.Cでコーディングされており、うまく動作します.しかし、私が使用する場合

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++ 例外: cv::Exception at memory location 0x0039ea0c..

以下がプログラム全体です。誰かが私を助けてくれることを願っています。どうもありがとう

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

}

4

1 に答える 1

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 インターフェイスが含まれているためです。

アップデート:

もちろん、cv::Mat を使用する場合は、そのためにも新しい関数を使用する必要があります。

CvCopy は cv::copy になり、cvReleaseImage は必要ありません。cvRectangle は cv::rectangle になり、cvSetImageROI は img(rect) になります。cvPoint は cv::Point になります。 cvRect は cv::Rect になります。 cvCloneImage は img.clone() になります。 ..

または、古い関数を使用するには、cv::Mat から IplImage への変換が必要です。前後の変換を扱うSOについていくつか質問があります。

更新 2:

cv::を使用しているため、すべて削除することをお勧めしますusing namespace cv

次に、古いプレフィックスが残っている関数と変数を確認し、cvそれらのプレフィックスを削除します。(私はまだ1つを見つけました:)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_ 定数) であることに注意してください。

于 2012-12-03T20:40:35.620 に答える