0

このようなことをしても大丈夫ですか、コードスニペットはもちろん完全ではありません。私が何を意味するかを示すためだけです。

void draw(IplImage* image){
cvLine(image,cvPoint(20,20),cvPoint(100,100),cvScalar(0,0,255),1);}

int main(){

cvNamedWindow("preview",CV_WINDOW_AUTOSIZE);
IplImage* image;
image=cvCreateImage(cvSize(480,360),8,3);
while(true){
draw(image);
cvShowImage("preview",image);
int ops=cvWaitKey(10)
if ops!=-1 break;}
cvReleaseImage(&image);cvDestroyWindow("preview");return 0;
}

または、次のようにIplImageを返さないと、問題が発生します。

IplImage* draw(IplImage* image){
    cvLine(image,cvPoint(20,20),cvPoint(100,100),cvScalar(0,0,255),1);return image;}

ええと、私が尋ねている理由は、IplImageを返さないとうまくいくことがあるからです。ただし、他の場合には、ある種のNULLポインタエラーメッセージが表示されることもあります。たとえば、関数で画像を解放し、その直後に画像を新たに作成した場合、その関数に残っていると、クラッシュが発生する可能性があります。

4

1 に答える 1

0

何も返す必要はありませんが、失敗をチェックする必要があります。

問題は、安全にコーディングしていないことです。OpenCV 関数を呼び出すときに失敗をチェックすることはありません。これにより、パラメーターとしてポインターをdraw()受け取るNULL可能性があり、途中でクラッシュやその他の奇妙な動作が発生する可能性があります。

最初にすべきことは、防御的にコーディングを開始することです。

IplImage* image = cvCreateImage(cvSize(480,360),8,3);
if (!image)
{
    // print error and quit
}

関数内に安全チェックを追加しても害はありません。

void draw(IplImage* image)
{
    if (!image)
    {
        // print error
        return;
    }

    cvLine(image,cvPoint(20,20),cvPoint(100,100),cvScalar(0,0,255),1);
}
于 2012-09-25T17:34:52.897 に答える