Chào mọi người, em là newbie trong lĩnh vực này, em đang làm 1 đề tài xử lý ảnh dùng camera cho , sử dụng thư viện opencv. Đề tài của em có liên quan đến nhận diện đối tượng bằng camera nhưng trước hết em xử lý trên ảnh trước cho dễ.
Em đang tìm hiểu về cách tách 1 vật thể trong 1 ảnh, em có đọc chuơng 8 trong sách Learning Opencv, trong đó có xử dụng hàm cvFindDominantPoints (ở trang 246 của sách) để tìm các "đỉnh" của vật thể (như hình):
và tạo hình tròn/vuông/tam giác... để "bao" đối tượng lại (như hình dưới):
Hàm cvFindDominantPoints() này là có sẵn nhưng không hiểu vì sao trong thư viện cv.h lại không có (dù em tìm khá kĩ ). Mong các bác giúp em.
Sắn đây em cũng xin post 1 ví dụ có sử dụng hàm này (em không chạy được code này vì khi debug có lỗi cvFindDominantPoints': identifier not found)
/*-------------------------------------------------------*/
#include <cv.h>
#include <highgui.h>
int main()
{
CvSeq* contours = 0; CvSeq* dps = 0;
int i, idx;
CvPoint p;
CvMemStorage* storage_dp = cvCreateMemStorage(0);
CvMemStorage* storage_ct = cvCreateMemStorage(0);
IplImage* img = cvLoadImage("ten_anh_nhap_vao.bmp", CV_LOAD_IMAGE_GRAYSCALE);
cvNamedWindow( "image" );
cvShowImage( "image", img );
cvFindContours(
img, storage_ct,
&contours,
sizeof(CvContour),
CV_RETR_TREE,
CV_CHAIN_APPROX_SIMPLE );
dps = cvFindDominantPoints(
contours,
storage_dp,
CV_DOMINANT_IPAN,
7, 20, 9, 150 );
contours = cvApproxPoly( contours, sizeof(CvContour), storage_ct, CV_POLY_APPROX_DP, 3, 1 );
printf("found %d DPs and %d Contours \n", dps->total, contours->total );
for ( i = 0; i < dps->total; i++)
{
idx = *(int *) cvGetSeqElem(dps, i);
p = *(CvPoint *) cvGetSeqElem(contours, idx);
cvDrawCircle( img, p , 1, cvScalarAll(255) );
printf("%d %d %d\n", idx, p.x, p.y);
}
cvDrawContours(img, contours, cvScalarAll(100), cvScalarAll(200), 100 );
cvNamedWindow( "contours" );
cvShowImage( "contours", img );
cvWaitKey(0);
cvReleaseMemStorage( &storage_ct );
cvReleaseMemStorage( &storage_dp );
cvReleaseImage( &img );
return 0;
}
/*------------------------------------------------------------------------------*/
Mong các bác chỉ em hướng gỡ rối
Em đang tìm hiểu về cách tách 1 vật thể trong 1 ảnh, em có đọc chuơng 8 trong sách Learning Opencv, trong đó có xử dụng hàm cvFindDominantPoints (ở trang 246 của sách) để tìm các "đỉnh" của vật thể (như hình):
và tạo hình tròn/vuông/tam giác... để "bao" đối tượng lại (như hình dưới):
Hàm cvFindDominantPoints() này là có sẵn nhưng không hiểu vì sao trong thư viện cv.h lại không có (dù em tìm khá kĩ ). Mong các bác giúp em.
Sắn đây em cũng xin post 1 ví dụ có sử dụng hàm này (em không chạy được code này vì khi debug có lỗi cvFindDominantPoints': identifier not found)
/*-------------------------------------------------------*/
#include <cv.h>
#include <highgui.h>
int main()
{
CvSeq* contours = 0; CvSeq* dps = 0;
int i, idx;
CvPoint p;
CvMemStorage* storage_dp = cvCreateMemStorage(0);
CvMemStorage* storage_ct = cvCreateMemStorage(0);
IplImage* img = cvLoadImage("ten_anh_nhap_vao.bmp", CV_LOAD_IMAGE_GRAYSCALE);
cvNamedWindow( "image" );
cvShowImage( "image", img );
cvFindContours(
img, storage_ct,
&contours,
sizeof(CvContour),
CV_RETR_TREE,
CV_CHAIN_APPROX_SIMPLE );
dps = cvFindDominantPoints(
contours,
storage_dp,
CV_DOMINANT_IPAN,
7, 20, 9, 150 );
contours = cvApproxPoly( contours, sizeof(CvContour), storage_ct, CV_POLY_APPROX_DP, 3, 1 );
printf("found %d DPs and %d Contours \n", dps->total, contours->total );
for ( i = 0; i < dps->total; i++)
{
idx = *(int *) cvGetSeqElem(dps, i);
p = *(CvPoint *) cvGetSeqElem(contours, idx);
cvDrawCircle( img, p , 1, cvScalarAll(255) );
printf("%d %d %d\n", idx, p.x, p.y);
}
cvDrawContours(img, contours, cvScalarAll(100), cvScalarAll(200), 100 );
cvNamedWindow( "contours" );
cvShowImage( "contours", img );
cvWaitKey(0);
cvReleaseMemStorage( &storage_ct );
cvReleaseMemStorage( &storage_dp );
cvReleaseImage( &img );
return 0;
}
/*------------------------------------------------------------------------------*/
Mong các bác chỉ em hướng gỡ rối
Comment