Re: [問題] 用opencv開啟webcam,畫面卻是黑的

看板C_and_CPP (C/C++)作者 (Sun)時間16年前 (2010/02/08 18:25), 編輯推噓6(6014)
留言20則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《zx4983047 (Sun)》之銘言: 用opencv開啟webcam,畫面卻是黑的,沒有影像 而且capture跟frame都不是NULL cvcamGetCamerasCount的值是1 請問各位大大這是為什麼呢? 感謝大家幫忙 在此附上我的程式碼 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <cvcam.h> int main() { CvCapture *capture; IplImage *frame; int CamerasCount= cvcamGetCamerasCount(); printf("視訊裝置總數量: %d\n",CamerasCount); capture =cvCaptureFromCAM(0) ; if(!capture) {return -1;} else {printf("Camera is OK! \n");} cvNamedWindow("Webcam",0); frame = cvQueryFrame(capture); if(!frame) {return -1;} else {printf("frame is OK! \n");} while(true) { frame = cvQueryFrame(capture); cvShowImage("Webcam",frame); if(cvWaitKey(1)>=0) { break; } } cvReleaseCapture(&capture); cvDestroyWindow("Webcam"); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.63.243

02/05 22:44,
改看看capture =cvCaptureFromCAM(1); 可能你有裝電視卡
02/05 22:44

02/06 13:30,
改1~9會直接跳出,11~20跟0一樣畫面全黑 Q.Q
02/06 13:30

02/07 01:52,
設定capture的長跟寬試試
02/07 01:52
抱歉,剛忘了放程式碼,所以重PO一次 想請問各位高手如何設定capture的長跟寬? 如果再不行可能要重買一台webcam了 因為專題需要用opencv開啟webcam來做處理 而我在昨日有看到另一種程式碼 compile後可以看到影像,只是會有紅色直線 想請問為什麼會這個可以,上個程式碼卻不行? 昨日的解釋看不太懂 希望各位高手不吝指教 謝謝 在此附上另一個程式碼 #include <cvcam.h> #include <cv.h> #include <highgui.h> #include <stdio.h> #include <windows.h> void CaptureCallback(IplImage *frame1); int main() { HWND CaptureWindow=0; int width=640; int height=480; int CamerasCount= cvcamGetCamerasCount(); printf("視訊裝置總數量: %d\n",CamerasCount); CameraDescription CameraDescription1; cvcamSetProperty(0,CVCAM_PROP_ENABLE,CVCAMTRUE); cvcamSetProperty(0,CVCAM_PROP_RENDER,CVCAMTRUE); cvcamSetProperty(0,CVCAM_PROP_WINDOW,&CaptureWindow); cvcamSetProperty(0,CVCAM_PROP_CALLBACK,(void *)&CaptureCallback); cvcamSetProperty(0,CVCAM_RNDWIDTH,&width); cvcamSetProperty(0,CVCAM_RNDHEIGHT,&height); cvcamGetProperty(0,CVCAM_VIDEOFORMAT,NULL); cvcamGetProperty(0,CVCAM_CAMERAPROPS,NULL); cvcamGetProperty(0,CVCAM_DESCRIPTION,&CameraDescription1); cvcamInit(); cvcamStart(); printf("===============================\n"); printf("選擇編號0的裝置\n"); printf("裝置名稱:\n%d\n",CameraDescription1.device); printf("裝置描述:\n%s\n",CameraDescription1.DeviceDescription); printf("裝置通道數:\n%d\n",CameraDescription1.channel); printf("裝置通道描述:\n%s\n",CameraDescription1.ChannelDescription); printf("最大寬上限:\n%d\n",CameraDescription1.maxwidth); printf("最大高上限:\n%d\n",CameraDescription1.maxheight); printf("最小寬上限:\n%d\n",CameraDescription1.minwidth); printf("最小高上限:\n%d\n",CameraDescription1.minheight); cvWaitKey(0); cvcamStop(); cvcamExit(); } void CaptureCallback(IplImage *frame1) { int i,j; for(i=0;i<frame1->height;i+=20) { for(j=0;j<frame1->widthStep;j+=frame1->nChannels) { frame1->imageData[i*j] =0; frame1->imageData[i*j+1]=0; frame1->imageData[i*j+2]=255; } } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.45.102.173

02/08 19:11, , 1F
用cvResize()修改長寬 這個是雙線性內插法
02/08 19:11, 1F

02/08 19:44, , 2F
cvResize()不是用來改圖片的嗎? 要怎麼使用在影像上呢?
02/08 19:44, 2F

02/08 21:14, , 3F
嗯…影像就是連續的播放圖片而成的東西
02/08 21:14, 3F

02/08 21:14, , 4F
所以如果你要處理每一張圖片 就是在CaptureCallback裡處理
02/08 21:14, 4F

02/08 21:15, , 5F
framel代表的就是每一張圖片
02/08 21:15, 5F

02/08 21:15, , 6F
建議你把CaptureCallback裡的程式碼先註解掉試看看
02/08 21:15, 6F

02/08 21:16, , 7F
然後傳進來的圖像是以三原色作儲存 並且是BGR的順序
02/08 21:16, 7F

02/08 21:17, , 8F
故函式裡的程式碼代表的是將每20行 第i*j個像素變成紅色
02/08 21:17, 8F

02/08 21:18, , 9F
所以理論上你所謂的紅色直線應該不只一條,並且是橫向的
02/08 21:18, 9F

02/08 21:21, , 10F
記住 處理一個影片 = 處理很多張圖片
02/08 21:21, 10F

02/08 23:16, , 11F
謝謝yyc大 我會試試看的
02/08 23:16, 11F

02/08 23:19, , 12F
如果要抓取指尖,改上一個跟這個哪個好呢?
02/08 23:19, 12F

02/09 00:36, , 13F
你只有下一個可以跑就用下一個呀= =
02/09 00:36, 13F

02/09 00:37, , 14F
重點都在於你要如何處理IplImage 要用顏色或形狀或其他
02/09 00:37, 14F

02/09 00:43, , 15F
也就是在一張圖裡 找出指尖的位置 這就看你個人的想法了~
02/09 00:43, 15F

02/09 18:50, , 16F
用cvSetCaptureProperty就能設定capture的長跟寬了
02/09 18:50, 16F

02/09 18:51, , 17F
之前印象中有過沒設長寬 影像跑不出來的情況
02/09 18:51, 17F

02/09 23:11, , 18F
參考一下 cvcamSelectCamera cvCreateCameraCapture
02/09 23:11, 18F

02/09 23:12, , 19F
順便問你一下你的 opencv 是哪一版的?
02/09 23:12, 19F

02/10 13:23, , 20F
妳用AMCAP這種程式抓得到影像嗎?
02/10 13:23, 20F
文章代碼(AID): #1BR-QKbR (C_and_CPP)
文章代碼(AID): #1BR-QKbR (C_and_CPP)