作者redonizuka (R大)
看板C_and_CPP
標題[問題] 基本RGB調色盤顯示(細部問題及程式優化)
時間Tue Apr 14 22:31:03 2015
開發平台(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
推 TobyH4cker: 一、多加一個參數,B就傳0,G傳1,R傳2,你懂的 04/15 02:29
→ redonizuka: Thanks :)) 04/15 04:19
後來遇到一個問題,在主程式內cvCreateTrackbar(..onTrackBarR)參數內
我onTrackBarR並沒有給予參數,因此若多加一個參數進去要進行判斷的話
會導致我也需要給予int position 一個質,但若給予值則就會出現錯誤了
※ 編輯: redonizuka (190.115.177.249), 04/15/2015 04:51:37
推 VSei: typedef void (CV_CDECL *CvTrackbarCallback)(int pos); 04/15 09:51
→ VSei: 所以應該不能多加一個參數吧? 04/15 09:52
→ VSei: 2.的問題可以在cvCreateImage直接先上一行cvShowImage 04/15 09:54
→ VSei: 可能是沒有showImage的動作windows沒有帶入參數更新 04/15 09:56
→ VSei: 另外建議可以在cvCreateTrackbar前先將整張圖片都寫入0 04/15 09:57
→ VSei: 起始畫面有初值才會顯示正常 04/15 09:59
→ TobyH4cker: 原來那個是事件喔,我沒寫過CV不知道 04/15 10:12
感謝各位的幫忙與討論,看來第一個問題有點無解的樣子
※ 編輯: redonizuka (190.115.183.169), 04/16/2015 01:34:48
→ TobyH4cker: 硬要的話就global variable了,執行一行 cvCreateTrac 04/16 01:47
→ TobyH4cker: kbar就遞增 04/16 01:48