[問題] OpenCV - cvCreateTrackbar 的使用

看板C_and_CPP作者 (無聊的人)時間13年前 (2010/09/29 01:42), 編輯推噓0(004)
留言4則, 3人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 用cvCreateTrackbar("名稱","視窗名稱",開始數值,最大值,Trackbar事件副程式名稱); 使用事件副程式後,出現記憶體錯誤。 希望得到的正確結果: 希望隨著trackbar的移動,圖片的亮度可以跟著改變。 程式跑出來的錯誤結果: 於 0x75a79617 的 trackbar.exe 中發生未處理的例外狀況: Microsoft C++ 在記憶體位置 0x0029d4f4,發生例外狀況: cv::Exception Bad argument (Array should be CvMat or IplImage) in unknown function,...\ cxarray.cpp, line 1233 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VC++ 有問題的code: (請善用置底文標色功能) #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <cmath> #include <iostream> CvScalar Scalar; CvScalar Scalar1; IplImage *Oimage=0; IplImage *Cimage=0; IplImage *Hueimage=0; IplImage *Satimage=0; IplImage *Valueimage=0; IplImage *Loghue=0; IplImage *Logsat=0; IplImage *Logvalue=0; IplImage *InvHue=0; IplImage *InvSat=0; IplImage *InvValue=0; char TrackbarName[]="Trackbar"; int IntPosition=32; int StopValue=100; int Height=0; int Width=0; *[1m//trackbar的副事件程式。經過一個方程式對每個pixel運算,並存起來。*[m void Handle(int position) { for(int i=0;i<Height;i++) { for(int j=0;j<Width;j++) { Scalar=cvGet2D(Cimage,i,j); Scalar.val[0]=position*log(double(Scalar.val[0]+1.0))/log(2.0); cvSet2D(Loghue,i,j,cvScalar(Scalar.val[0])); Scalar.val[1]=position*log(double(Scalar.val[1]+1))/log(2.0); cvSet2D(Logsat,i,j,cvScalar(Scalar.val[1])); Scalar.val[2]=position*log(double(Scalar.val[2]+1))/log(2.0); cvSet2D(Logvalue,i,j,cvScalar(Scalar.val[2])); } } *[1;36m//把結果show出來*[m cvShowImage("loghue",Loghue); cvShowImage("logsat",Logsat); cvShowImage("logvalue",Logvalue); } int main() { *[1;36m //讀圖,轉乘HSV,並存在Cimage。其他圖的標頭檔。*[m char FileName[]="3.jpg"; IplImage *Oimage=cvLoadImage(FileName,1); IplImage *Cimage=cvCreateImage(cvGetSize(Oimage), IPL_DEPTH_8U, 3); cvCvtColor(Oimage,Cimage,CV_BGR2HSV); IplImage *Hueimage=cvCreateImage(cvGetSize(Oimage),IPL_DEPTH_8U,1); IplImage *Satimage=cvCreateImage(cvGetSize(Oimage),IPL_DEPTH_8U,1); IplImage *Valueimage=cvCreateImage(cvGetSize(Oimage),IPL_DEPTH_8U,1); IplImage *Loghue=cvCreateImage(cvGetSize(Oimage),IPL_DEPTH_8U,1); IplImage *Logsat=cvCreateImage(cvGetSize(Oimage),IPL_DEPTH_8U,1); IplImage *Logvalue=cvCreateImage(cvGetSize(Oimage),IPL_DEPTH_8U,1); IplImage *InvHue=cvCreateImage(cvGetSize(Oimage),IPL_DEPTH_8U,1); IplImage *InvSat=cvCreateImage(cvGetSize(Oimage),IPL_DEPTH_8U,1); IplImage *InvValue=cvCreateImage(cvGetSize(Oimage),IPL_DEPTH_8U,1); *[1;36m //把HSV的三個band移出來。*[m cvSplit(Cimage,Hueimage,Satimage,Valueimage,0); int Height=cvGetDimSize(Oimage,0); int Width=cvGetDimSize(Oimage,1); *[1;36m//視窗*[m cvNamedWindow("origin"); cvNamedWindow("loghue"); cvNamedWindow("logsat"); cvNamedWindow("logvalue"); cvNamedWindow("hue"); cvNamedWindow("sat"); cvNamedWindow("value"); *[1;36m//開始創建trackbar*[m cvCreateTrackbar(TrackbarName,"loghue",&IntPosition,StopValue,Handle); cvCreateTrackbar(TrackbarName,"logsat",&IntPosition,StopValue,Handle); cvCreateTrackbar(TrackbarName,"logvalue",&IntPosition,StopValue,Handle); cvShowImage("origin",Oimage); cvShowImage("hue",Hueimage); cvShowImage("sat",Satimage); cvShowImage("value",Valueimage); cvWaitKey(0); cvDestroyWindow("origin"); cvDestroyWindow("loghue"); cvDestroyWindow("logsat"); cvDestroyWindow("logvalue"); cvDestroyWindow("hue"); cvDestroyWindow("sat"); cvDestroyWindow("value"); cvReleaseImage(&Loghue); cvReleaseImage(&Logsat); cvReleaseImage(&Logvalue); cvReleaseImage(&Hueimage); cvReleaseImage(&Satimage); cvReleaseImage(&Valueimage); return 0; } 補充說明: 小的,是c和opencv的新手,麻煩鞭小力一點~~ 用了好幾天都用不出來,所以上來求救,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.222.66 ※ 編輯: kasim0226 來自: 140.115.222.66 (09/29 01:46) ※ 編輯: kasim0226 來自: 140.115.222.66 (09/29 01:55) ※ 編輯: kasim0226 來自: 140.115.222.66 (09/29 01:57)

09/29 08:13, , 1F
是用2.0嗎? 我記得2.0這個功能是有問題的 要改成2.1才會好
09/29 08:13, 1F

09/29 10:10, , 2F
偷偷問Trackbar的handle function可自行增加參數嗎
09/29 10:10, 2F

09/29 10:11, , 3F
我現在只會把想要傳遞的值設為全域
09/29 10:11, 3F

09/29 14:48, , 4F
我是用2.1,不過不知道為啥還是錯= ="
09/29 14:48, 4F
文章代碼(AID): #1CeYaUT9 (C_and_CPP)