[問題] openCV找顏色平均中心

看板C_and_CPP作者 (arpeggio)時間13年前 (2010/08/20 14:41), 編輯推噓0(005)
留言5則, 3人參與, 最新討論串1/1
我想要抓視訊影像三個原色的平均中心 所謂平均中心就是像質心那樣定義 X=sum(m*x)/sum(m) Y=sum(m*x)/sum(m) 就是加總每一個(像素的R or G or B)*(像素的x或是y座標)/加總(像素的R or G or B) 求出平均的中心 問題是這樣的: 為什麼有時候出來的座標會有負值!??囧 而且看起來座標位置看起來也不太對 (我拿很鮮豔的藍綠紅的東西在webcam前面晃 座標沒有跟著跑) 用Visual Studio 08(C++)寫的 感謝你的熱情幫忙!! ------------------------------------------------------------------------------ 程式碼如下 // RGBcenters.cpp : 定義主控台應用程式的進入點。 // #include "stdafx.h" #include "cv.h" #include "highgui.h" #include "iostream" using namespace std; char Blue[800][600]; char Green[800][600]; char Red[800][600]; float center_Blue_x=0; float center_Blue_y=0; float total_Blue=0; float moment_Blue_x=0; float moment_Blue_y=0; float center_Red_x=0; float center_Red_y=0; float total_Red=0; float moment_Red_x=0; float moment_Red_y=0; float center_Green_x=0; float center_Green_y=0; float total_Green=0; float moment_Green_x=0; float moment_Green_y=0; int main() { CvCapture*webcam; IplImage*testImg; webcam=cvCaptureFromCAM(0); cvNamedWindow("test",0); cvResizeWindow("test",800,600); while(true) { system("cls"); testImg=cvQueryFrame(webcam); for(int i=0;i<testImg->height;i++) { for(int j=0;j<testImg->widthStep;j+=3) { Blue[i][int(j/3)]=testImg->imageData[i*testImg->widthStep+j]; Green[i][int(j/3)]=testImg->imageData[i*testImg->widthStep+j+1]; Red[i][int(j/3)]=testImg->imageData[i*testImg->widthStep+j+2]; total_Blue+=Blue[i][int(j/3)]; moment_Blue_x+=Blue[i][int(j/3)]*i; moment_Blue_y+=Blue[i][int(j/3)]*int(j/3); total_Red+=Red[i][int(j/3)]; moment_Red_x+=Red[i][int(j/3)]*i; moment_Red_y+=Red[i][int(j/3)]*int(j/3); total_Green+=Green[i][int(j/3)]; moment_Green_x+=Green[i][int(j/3)]*i; moment_Green_y+=Green[i][int(j/3)]*int(j/3); } } center_Blue_x=moment_Blue_x/total_Blue; center_Blue_y=moment_Blue_y/total_Blue; cout<<"blue"<<"("<<center_Blue_x<<","<<center_Blue_y<<")"<<endl; cvCircle(testImg,cvPoint(center_Blue_x,center_Blue_y),5,cvScalar(255,0,0,0),1,CV_AA,0); center_Red_x=moment_Red_x/total_Red; center_Red_y=moment_Red_y/total_Red; cout<<"red"<<"("<<center_Red_x<<","<<center_Red_y<<")"<<endl; cvCircle(testImg,cvPoint(center_Red_x,center_Red_y),5,cvScalar(0,0,255,0),1,CV_AA,0); center_Green_x=moment_Green_x/total_Green; center_Green_y=moment_Green_y/total_Green; cout<<"green"<<"("<<center_Green_x<<","<<center_Green_y<<")"<<endl; cvCircle(testImg,cvPoint(center_Green_x,center_Green_y),5,cvScalar(0,255,0,0),1,CV_AA,0); cvShowImage("test",testImg); if(cvWaitKey(100)>=0) {break;} } cvReleaseImage(&testImg); cvDestroyWindow("test"); return 0; } -- 只是不想停下來而已。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.124.80.228 ※ 編輯: gixd 來自: 59.124.80.228 (08/20 14:47)

08/20 14:50, , 1F
抓Bug怎麼抓? 怎麼把你口中的"有時候"變成"總是"?
08/20 14:50, 1F

08/20 14:54, , 2F
不懂??
08/20 14:54, 2F

08/20 18:18, , 3F
取像素值的時候先強制轉成unsigned char
08/20 18:18, 3F

08/20 19:02, , 4F
我找到bug了 我每次重抓影像沒有把連加的數字歸零 所以越加越
08/20 19:02, 4F

08/20 19:02, , 5F
大 就會跑出很奇怪的東西了@@
08/20 19:02, 5F
文章代碼(AID): #1CRYE07_ (C_and_CPP)