Chương 1 : TỔNG QUAN VỀ ROBOT DI ĐỘNG
2.4 THƯ VIỆN MÃ NGUỒN MỞ OPENCV
2.4.2 Một số hàm thông dụng của OpenCV
Như đã giới thiệu ở trên, hệ thống hàm của Opencv rất lớn, dưới đây trình bày một số hàm cơ bản và thường xuyên được sử dụng:
Chuyển đổi không gian màu:
Trong OpenCV, các không gian màu được chuyển đổi qua lại nhờ hàm cvtColor (convert color), nguyên mẫu hàm này như sau:
cv::cvtColor(cv::InputArray src, cv::OutputArray dst, int code);
Trong đó, src, dst là ảnh gốc và ảnh thu được sau khi chuyển đổi không gian màu. code là mã chuyển đổi không gian màu. OpenCV định nghĩa khá nhiều chuyển đổi giữacáckhông gian màu chẳng hạn như code = CV_BGR2GRAY sẽ chuyển ảnh ở không gian màu RGB sang ảnh xám, code = CV_HSV2BGR sẽ chuyển ảnh ở không gian màu HSV sang không gian màu RGB, code = CV_ BGR2HSV sẽ chuyển ảnh ở không gian màu RGB sang không gian màu HSV …
Smoothing (làm mịn):
Smoothing hay còn gọi là blurring nó là một thuật toán xử lý ảnh đơn giản và thường xuyên sử dụng. Có rất nhiều nguyên nhân chúng ta dùng đến smoothing nhưng nó thường dùng để loại bỏ nhiễu do máy ảnh hoặc camera sinh ra. Smoothing quan trọng khi bạn muốn giảm độ phân giải của một bức ảnh theo rất nhiều cách khác nhau. Bằng việc thay thế kiểu smooth và các thông số sẽ có các bức ảnh tương đối khác nhau tuy theo mục đích sử dụng nhưng thường dùng nhất vẫn là CV_GAUSSIAN.
Nguyên mẫu hàm này như sau: void cvSmooth(const CvArr* src,CvArr* dst,int
30
smoothtype = CV_GAUSSIAN,int param1 = 3,int param2 = 0,double param3 = 0,double param4 = 0);
Hình 2.12 Ảnh được làm mịn (Smoothing)
Threshold (Phân ngưỡng - Nhị phân hóa):
Nguyên mẫu hàm này như sau: threshold(cv::InputArray src, cv::OutputArray dst, double thresh, int maxval, int type);
Trong đó, src là ảnh đầu vào một kênh màu (ảnh xám …), dst là ảnh sau khi được nhị phân hóa, thresh là ngưỡng nhị phân, maxval là giá trị lớn nhất trong ảnh (maxval = 255đối với ảnh xám), type là kiểu nhị phân có thể là
CV_THRESH_BINARY, CV_THRESH_BINARY_INV, CV_THRESH_OTSU… lần lượt là nhị phân hóa thông thường, nhị phân hóa ngược và nhị phân hóa theo thuật toán Otsu …
Kết quả của việc nhị phân hóa một ảnh phụ thuộc vào ngưỡng T, có nghĩa là với mỗi ngưỡng T khác nhau thì ta có những ảnh nhị phân khác nhau.
(2.8) (2.7)
31
Hình 2.13 Ảnh sau khi được phân ngưỡng
Histogram:
Histogram của ảnh là một biểu đồ nói lên mối quan hệ giữa các giá trị của Pixcel ảnh( Điểm Ảnh) và tần xuất xuất hiện của chúng. Nhìn vào biểu đồ histogram ta có thể đoán được ảnh sáng tối như thế nào, nếu ảnh có biểu đồ histogram lệch về phía phải ta nói ảnh đó thừa sáng và ngược lại, ảnh có biểu đồ histogram lệch về phía trái ta nói ảnh đó thiếu sáng.
32
Tìm histogram được sử dụng rất nhiều trong các chương trình ứng dụng thị giác máy tính. Histogram được sử dụng để dò tìm sự thay đổi giữa các cảnh trong video bằng cách đánh dấu khi cạnh và màu sắc thay đổi từ khung này đến khung khác. Chúng sử dụng để nhận dạng những điểm quan tâm trên một bức ảnh bằng cách gán mỗi điểm ảnh một “Tag” chứa những Histogram của những đặc điểm gần nhất. Histogram của cạnh, màu, góc và rất nhiều đặc điểm khác.
Ta thường sử dụng hai hàm chính để tính toán Histogram và cân bằng histogram như sau:
- Để tính toán Histogram ta dùng hàm:
cv::calcHist(constcv::Mat*images, int nimages, const int *channels,cv::InputArray mask, cv::OutputArray hist, int dims, const int histSize, const float**ranges, bool uniform = true, bool accumulate = false).
Hàm này sẽ tính histogram của ảnh đầu vào images và lưu kết quả tính toán vào mảng hist. Các thông số khác bao gồm: nimages là số lượng ảnh đầu vào, channels
là danh sách chiều các kênh dung để tính histogram, mask là một mặt nạ tùy chỉnh, nếu không dung gì thì để là cv::Mat(). dims là chiều của histogram, bản OpenCV hiện tại hỗ trợ tính toán histogram với số chiều lên tới 32. histSize là kích thước dãy histogram mỗi chiều, hai tham số cuối có thể để mặc định.
- Để cân bằng Histogram ta dùng hàm:
cv:: equalizeHist(cv::InputArray src, cv::OuputArray dst);
Trong đó, src là ảnh đầu vào một kênh màu (ảnh chẳn hạn), dst là ảnh sau khi cân bằng.
Xác định sườn Canny:
Bộ tách sườn theo ảnh Canny dựa trên cặp đạo hàm riêng bậc nhất với việc làm sạch nhiễu.
Nguyên mẫu hàm này như sau:
void cvCanny(const CvArr* img,CvArr* edges, double lowThresh,double highThresh,int apertureSize = 3);
(2.9)
(2.10)
33
Hình 2.15 Sườn Canny Ngoài ra còn một số hàm hay được sử dụng khác như: Ngoài ra còn một số hàm hay được sử dụng khác như:
- Hàm tạo cửa sổ: int cvNamedWindow(const char* name, int flags = CV_WINDOW_AUTOSIZE);
- Hàm load file ảnh: IplImage* cvLoadImage(const char* filename, int iscolor = CV_LOAD_IMAGE_COLOR);
- Hàm Hiển thị hình ảnh:
void cvShowImage(const char* name, const CvArr* image);
- Hàm sử dụng chuột để tương tác với ảnh:
void CvMouseCallback(int event, int x, int y, int flags, void* param);
- Hàm làm việc với file video:
CvCapture* cvCreateFileCapture( const char* filename );
- Hàm làm việc với camera:
CvCapture* cvCreateCameraCapture( int index );
- Hàm lấy một frame ảnh trong camera hoặc file video:
int cvGrabFrame( CvCapture* capture );
- Hàm thay đổi kích thước ảnh: void cvResize(const CvArr* src,CvArr* dst,int interpolation = CV_INTER_LINEAR);
- Hàm tăng kích thước ảnh lên gấp 2: void cvPyrDown(IplImage* src,IplImage* dst,IplFilter filter = IPL_GAUSSIAN_5x5);
- Hàm giảm kích thước ảnh đi một nửa: void cvPyrUp(IplImage* src,IplImage*
(2.12) (2.13) (2.14) (2.15) (2.16) (2.17) (2.18) (2.19) (2.20)
34
dst,IplFilter filter = IPL_GAUSSIAN_5x5);
- Hàm phát hiện đường thẳng: CvSeq* cvHoughLines2(CvArr* image,void* line_storage,int method,double rho,double theta,int threshold,double param1 = 0,double param2 = 0);
- Hàm phát hiện đường tròn: CvSeq* cvHoughCircles(CvArr* image,void* circle_storage,int method,double dp,double min_dist,double param1 = 100,double param2 = 300,int min_radius = 0,int max_radius = 0);
- Hàm tìm đối tượng trong ảnh: int cvFindContours(IplImage* img, CvMemStorage * storage,CvSeq** firstContour,int headerSize = sizeof (CvContour) , CvContourRetrievalMode mode = CV_RETR_LIST, CvChainApproxMethod method = CV_CHAIN_APPROX);
- Hàm vẽ một viền bao quanh các đối tượng tìm được từ hàm cvFindContour: void cvDrawContours(CvArr* img,CvSeq* contour,CvScalar external_color,CvScalar hole_color,int max_level,int thickness = 1,int line_type = 8,CvPoint offset = cvPoint(0,0));