[問題] 基本RGB調色盤顯示(細部問題及程式優化)

看板C_and_CPP (C/C++)作者 (R大)時間11年前 (2015/04/14 22:31), 11年前編輯推噓2(2010)
留言12則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) codeBlocks 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenCV 問題(Question): 大家好: 目前利用opencv來學習影像處理以及辨識,試寫了一個調色盤程式來學習 但其中有兩點問題想要詢問大家,程式碼如下 #include <stdio.h> #include <stdlib.h> #include <highgui.h> #include <cv.h> char TrackBarNameB[]="B"; char TrackBarNameG[]="G"; char TrackBarNameR[]="R"; void onTrackBarB(int position); void onTrackBarG(int position); void onTrackBarR(int position); IplImage *Image1; int main() { cvNamedWindow("Show Image",0); CvSize Image1Size=cvSize(640,480); Image1=cvCreateImage(Image1Size,IPL_DEPTH_8U,3); // cvResizeWindow("Show Image",1024,768); cvCreateTrackbar(TrackBarNameB,"Show Image",0,255,onTrackBarB); cvCreateTrackbar(TrackBarNameG,"Show Image",0,255,onTrackBarG); cvCreateTrackbar(TrackBarNameR,"Show Image",0,255,onTrackBarR); cvWaitKey(0); cvDestroyAllWindows(); cvReleaseImage(&Image1); } void onTrackBarB(int position) { int i,j; for(i=0;i<Image1->height;i++) { for(j=0;j<Image1->widthStep;j=j+3) { Image1->imageData[i*Image1->widthStep+j]=position; } } cvShowImage("Show Image",Image1); } void onTrackBarG(int position) { int i,j; for(i=0;i<Image1->height;i++) { for(j=0;j<Image1->widthStep;j=j+3) { Image1->imageData[i*Image1->widthStep+j+1]=position; } } cvShowImage("Show Image",Image1); } void onTrackBarR(int position) { int i,j; for(i=0;i<Image1->height;i++) { for(j=0;j<Image1->widthStep;j=j+3) { Image1->imageData[i*Image1->widthStep+j+2]=position; } } cvShowImage("Show Image",Image1); } 第一個問題:void onTrackBarR(int position)、void onTrackBarG(int position)、 void onTrackBarB(int position) 這三個副程式內容物幾乎一樣,有辦法將這三個富城是結合在一起,變成呼叫一個副程式 即可以達到三原色數值擷取及顯示的功能嗎? 若能想詢問如何修改? 第二個問題:這個程式在調整影像尺寸的時候, 我以CvSize Image1Size=cvSize(640,480); 此函數來定義,但當我直接對此函數進行尺寸修改的時候 ,如CvSize Image1Size=cvSize(320,240);時,他仍然顯示640,480的尺寸,反而要透過 cvResizeWindow("Show Image",1024,768);才會進行變更,以確定有重新build,想請問 此點原因? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 190.115.177.249 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1429021866.A.3E6.html

04/15 02:29, , 1F
一、多加一個參數,B就傳0,G傳1,R傳2,你懂的
04/15 02:29, 1F

04/15 04:19, , 2F
Thanks :))
04/15 04:19, 2F
後來遇到一個問題,在主程式內cvCreateTrackbar(..onTrackBarR)參數內 我onTrackBarR並沒有給予參數,因此若多加一個參數進去要進行判斷的話 會導致我也需要給予int position 一個質,但若給予值則就會出現錯誤了 ※ 編輯: redonizuka (190.115.177.249), 04/15/2015 04:51:37

04/15 09:51, , 3F
typedef void (CV_CDECL *CvTrackbarCallback)(int pos);
04/15 09:51, 3F

04/15 09:52, , 4F
所以應該不能多加一個參數吧?
04/15 09:52, 4F

04/15 09:54, , 5F
2.的問題可以在cvCreateImage直接先上一行cvShowImage
04/15 09:54, 5F

04/15 09:56, , 6F
可能是沒有showImage的動作windows沒有帶入參數更新
04/15 09:56, 6F

04/15 09:57, , 7F
另外建議可以在cvCreateTrackbar前先將整張圖片都寫入0
04/15 09:57, 7F

04/15 09:59, , 8F
起始畫面有初值才會顯示正常
04/15 09:59, 8F

04/15 10:12, , 9F
原來那個是事件喔,我沒寫過CV不知道
04/15 10:12, 9F

04/15 10:20, , 10F
感謝各位的幫忙與討論,看來第一個問題有點無解的樣子 ※ 編輯: redonizuka (190.115.183.169), 04/16/2015 01:34:48

04/16 01:47, , 11F
硬要的話就global variable了,執行一行 cvCreateTrac
04/16 01:47, 11F

04/16 01:48, , 12F
kbar就遞增
04/16 01:48, 12F
文章代碼(AID): #1LBIIgFc (C_and_CPP)
文章代碼(AID): #1LBIIgFc (C_and_CPP)