全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:7287
推到 Plurk!
推到 Facebook!

OpenCV 的 cvNamedWindow 是否可以不要用?

 
MyBCB
一般會員


發表:4
回覆:7
積分:2
註冊:2006-07-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-02-02 01:31:08 IP:139.175.xxx.xxx 訂閱
各位好
我有一個困擾, 如果用OpenCV, 要show 出東西, 即使不顯示在cvNamedWindow所建立的視窗,
而另外顯示在另一物件上(如 Image) ; 如果沒用cvNamedWindow 先建一個視窗, 程式都沒有辦法
顯示結果在Image上, 可以不用cvNamedWindow 嗎?
PcGrek
一般會員


發表:1
回覆:4
積分:1
註冊:2005-10-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-02-02 07:12:03 IP:140.124.xxx.xxx 訂閱
可以到 yahoo 的 OpenCV 討論區
tech.groups.yahoo.com/group/OpenCV/
有一個function 可以把 IplImage 轉 Bitmap,如下:
<textarea class="cpp" rows="10" cols="60" name="code">//////////////////////////////////////////////////////////////////////////// // - the IplImage "src" Image must have a IPL_DEPTH_8U depth // // and 1 or 3 channels // // - the convertion is done in regards to the ROI if it is set // // - if you want to stretch your TBitmap ,specify width and height before // // calling the function // //////////////////////////////////////////////////////////////////////////// bool __fastcall IplImageToTBitmap (const IplImage *src,Graphics::TBitmap *dest) { if (!src || !dest) return false; IplImage *temp; CvRect roi; if (src->roi) roi=cvGetImageROI(src); else roi=cvRect(0,0,src->width,src->height); temp=cvCreateImage(cvSize(roi.width,roi.height),IPL_DEPTH_8U,3); if (src->nChannels!=3) cvCvtColor(src,temp,CV_GRAY2RGB); else cvCopy(src,temp); if (dest->Width==0 || dest->Height==0) { dest->Width = roi.width; dest->Height = roi.height; } else { IplImage *temp1=cvCloneImage(temp); cvReleaseImageData(temp); cvInitImageHeader(temp,cvSize(dest->Width,dest->Height),IPL_DEPTH_8U,3,src>origin,4); cvCreateImageData(temp); roi.width=dest->Width; roi.height=dest->Height; cvResize(temp1,temp); cvReleaseImage(&temp1); } dest->PixelFormat=pf24bit; try { unsigned char *pLine; int x,y; for(y=0 ;yScanLine[y]; for(x=0 ;x imageData temp->widthStep*y))[x]; } } } catch(...) { ShowMessage("Error while converting ..."); } cvReleaseImage(&temp); return true; } </textarea>
ps. 有設定style 是 code 了,還是沒有縮排…orz
MyBCB
一般會員


發表:4
回覆:7
積分:2
註冊:2006-07-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-02-02 11:30:01 IP:139.175.xxx.xxx 訂閱
參考這個 function

Graphics::TBitmap *CapImg1 = new Graphics::TBitmap();
IplImageToTBitmap (img,CapImg1);
Form1->Image1->Picture->Bitmap->Assign(CapImg1);
delete CapImg1;

並把原本的
cvNamedWindow( "result", 1 );
去掉

Image1 裡面都沒有顯示任何東西;


但是如果保留 cvNamedWindow( "result", 1 );

Image1 裡面就會同步顯示 result 視窗的東西,

現在問題解決一半, 但是還是要有cvNamedWindow才行
還有辦法改善嗎?

PcGrek
一般會員


發表:1
回覆:4
積分:1
註冊:2005-10-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-02-02 14:24:18 IP:140.124.xxx.xxx 訂閱
請試試 加上
Image1->Repaint();
or
Image1->Refresh();
MyBCB
一般會員


發表:4
回覆:7
積分:2
註冊:2006-07-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-02-03 00:33:38 IP:139.175.xxx.xxx 訂閱
賓GO! 解決了我的困擾,謝謝!
miaoweiwei
一般會員


發表:1
回覆:2
積分:0
註冊:2007-06-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-06-14 00:37:40 IP:140.118.xxx.xxx 訂閱
不好意思~我也發生同樣的問題!一定要SHOW WINDOW才能SHOW到BCB的IMAGE上
而且通常我一把WINDOW關掉程式就會沒有回應~
感覺是無窮迴圈的問題!懇請高手指點!
以下是我部分CODE~

[code cpp]
CvCapture* capture = 0;
IplImage *frame, *frame_copy = 0;
String cascade_name = Edit3->Text;
cascade= (CvHaarClassifierCascade*)cvLoad( cascade_name.c_str()/*,0,0,0 */);
storage = cvCreateMemStorage(0);

capture = cvCaptureFromCAM(0);

cvNamedWindow( "face",1);//去掉此行程式執行時會無法回應
if( capture )
{
for(;;)
{
// Capture the frame and load it in IplImage
if( !cvGrabFrame( capture ))
break;

frame = cvRetrieveFrame( capture );
if( !frame )
break;
if( !frame_copy )
frame_copy = cvCreateImage( cvSize(320,240),
IPL_DEPTH_8U, 3 );
// Check the origin of image. If top left, copy the image frame to frame_copy
if( frame->origin == IPL_ORIGIN_TL )
cvCopy( frame, frame_copy, 0 );
// Else flip and copy the image
else
cvFlip( frame, frame_copy, 0 );

New_detect_and_draw( frame_copy );

Graphics::TBitmap *CapImg1 = new Graphics::TBitmap();

IplImageToTBitmap (frame_copy,CapImg1);
Image4->Picture->Bitmap->Assign(CapImg1);
Image4->Refresh();
delete CapImg1;


//cvShowImage( "face", frame );
// Wait for a while before proceeding to the next frame
if( cvWaitKey( 10 ) >= 0 ) break;

}

cvReleaseImage( &frame_copy );
cvReleaseCapture( &capture );
cvReleaseHaarClassifierCascade( &cascade );
}
// Destroy the window previously created with filename: "result"
cvDestroyWindow("face");

[/code]
系統時間:2024-04-27 22:43:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!