[問題] OpenCV - cvCreateTrackbar 的使用
( *[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
09/29 08:13, 1F
→
09/29 10:10, , 2F
09/29 10:10, 2F
→
09/29 10:11, , 3F
09/29 10:11, 3F
→
09/29 14:48, , 4F
09/29 14:48, 4F