輪郭を検出するために使用したコードは次のとおりです。
IplImage* DetectAndDrawQuads(IplImage* img)
{
CvSeq* contours;
CvSeq* result;
CvMemStorage *storage = cvCreateMemStorage(0);
IplImage* ret = cvCreateImage(cvGetSize(img), 8, 3);
IplImage* temp = cvCreateImage(cvGetSize(img), 8, 1);
cvCvtColor(img, temp, CV_BGR2GRAY);
cvFindContours(temp, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
while(contours)
{
result = cvApproxPoly(contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.10, 0); //*0.2
if((result->total) == 4)
{
CvPoint *pt[4];
for(int i=0;i<4;i++)
pt[i] = (CvPoint*)cvGetSeqElem(result, i);
cvLine(ret, *pt[0], *pt[1], cvScalar(255));
cvLine(ret, *pt[1], *pt[2], cvScalar(255));
cvLine(ret, *pt[2], *pt[3], cvScalar(255));
cvLine(ret, *pt[3], *pt[0], cvScalar(255));
}
contours = contours->h_next;
}
cvReleaseImage(&temp);
cvReleaseMemStorage(&storage);
return ret;
}
int main()
{
IplImage* img = cvLoadImage("D:\\Database\\eye2.jpg");
IplImage* contourDrawn = 0;
cvNamedWindow("original");
cvShowImage("original", img);
contourDrawn = DetectAndDrawQuads(img);
cvNamedWindow("contours");
cvShowImage("contours", contourDrawn);
cvWaitKey(0);
return 0;
}
そして、これは私がプログラムをテストするために使用した写真です:入力
入力された顔の表情を見つけるための準備段階として、輪郭を取得しようとしています。そして、これはプログラムを実行しようとしたときの結果です (元の[左] と出力[右]): 結果
ご覧のとおり、バイナリ イメージにノイズが残っているようです (これは、輪郭検索プログラム (上記のコード) に入力する前に実際に前処理しました)。
私の質問は:
- 輪郭のポイントを見つける方法 (例: 上、下、中央、左端、右端 --> 顔の表情を決定するための幾何学的計算を行うための重要なポイント)。
あなたが私を助けてくれるなら、どうもありがとう。これまでのところ、これは輪郭の検索に関して生成できる最高の出力です。また、輪郭をより正確に抽出するのを手伝っていただければ、非常に感謝しています。ありがとうございました。:)