[問題] openCV找顏色平均中心
我想要抓視訊影像三個原色的平均中心
所謂平均中心就是像質心那樣定義
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
08/20 14:50, 1F
→
08/20 14:54, , 2F
08/20 14:54, 2F
→
08/20 18:18, , 3F
08/20 18:18, 3F
→
08/20 19:02, , 4F
08/20 19:02, 4F
→
08/20 19:02, , 5F
08/20 19:02, 5F