TRƯỜ NG NG CAO ĐẲNG KỸ THUẬT LÝ TỰ TRỌNG TP.HỒ CHÍ
INH
KHOA ÔNG NGHỆ THÔNG TIN
Đề tài nghiên c ứ u khoa học sinh viên:
BIÊN DỊCH ÀI HƯỚ NG NG DẪN SỬ DỤNG BỘ THƯ VIỆN NGUỒN MỞ OPENCV Sinh viên th ự c hiện: BÙI ẤN AN Lớ p: p: 10CDTP1 Ngườ i hướ ng ng dẫn: NGUY N NGỌC TRANG
1
Mục lục: Phần I. Mở đầ ở đầu…..………………..………………..………………..………………...……....... 3 1. Lý do chọn đề tài…..………………..………………..………………..…………..……....... 3 2. Xác định mục tiêu nghiên cứu: …..………………..…………………………..……....... 3. Đối tượ ng ng nghiên cứu: …..………………..………………..…………………….……...... 4. Phạm vi nghiên cứu: …..……………….………………..……………………….……....... 5. Đặt giả thuyết: …..………………..………………..………………..……………………...... 6. Thực trạng và khảo sát về bộ thư viện nguồn mở OpenCV:……… ……... 6.1. Thực trạng: …..………………..………………..………………..…………..……...... 6.2. Khảo sát…..………………..………………..………………..……………....…….......
Phần II. Quy trình th ự c hiện…..………………..………………..…………………......
Phần III. Tổng kết…..………………..………………..………………..…………….……....... 1. Hướ ng ng phát triển của đề tài: …..………………..………………………………...... 2. Kinh nghiệm: …..………………..………………..…………………………...……......
Tài liệu hướ ng ng dẫn sử sụng OpenCV v2.1…..………………...…….....
3 3 4 4 5 5 5 15 16 17 17 19
2
Đề tài:
BIÊN DỊCH ÀI HƯỚ NG NG DẪN SỬ DỤNG BỘ THƯ VIỆN NGUỒN MỞ OPENCV
Phần I. Mở đầ ở đầu: 1. Lý do ch ọn đề tài: Tôi rất quan tâm tớ i công nghệ nhận dạng máy tính, công ngh ệ này rất mớ i,i, ứng dụng rộng rãi ĩ nh trên nhiều ngành khác nhau, đặc bi t là trong l ĩ nh vực chế tạo robot. Nhưng vi c tìm kiếm nguồn tài liệu Tiếng Việt về OpenC hiện nay rất hiếm, phần lớ n tài liệu là b n tiếng Anh, gây nhiều khó khăn trong cho sinh viên muốn học hoặc ứng dụng. Vì lí do trên tôi chọn đề tài này, mong muốn cung cấp cho các b n nguồn tài liệu Tiếng Việt, rất mong sẽ giúp ích cho các bạn.
2. Xác định mục tiêu nghiên c ứ u: u: - Mục tiêu: Đề tài này,tôi s ẽ biên dị h tài liệu hướ ng ng dẫn từ tiếng Anh sang tiến Việt, cùng vớ i code mẫu giúp cho ngườ i học dễ dàng trong cách sử dụng bộ thư viện đ lập trình. - Mục đích: Cung cấp nguồn tài liệ tiếng Việt cho sinh viên Vi ệt Nam tham khảo, học tập, nghiên cứu lập trình dễ dàng trên bộ hư viện OpenCV.
3. Đối tượ ng ng nghiên c ứ u: u: - Đối tượ ng ng nghiên cứu: Bộ thư viện OpenCV 2.1 C API - Khác Kháchh th ng nghi hiên ên cứu: Sinh viên gành Công nghệ thông tin, đặc biệt là các l ập trình viên muốn học tập, nghiên cứu bộ thư việ này. 3
4. Phạm vi nghiên cứ u: OpenCV 2.1 C API
5. Đặt giả thuyết: Việc tôi biên dịch tài li ệu OpenCV này, nó th ật sự giúp ích cho bạn trong việc học, sử dụng bộ thư viện này ? Thật sự cần thết khi bạn quan tâm tớ i nó ? Có nó sẽ giúp bạn tự học bộ thư viện này ? Vớ i nguồn tài liệu đượ c biên dịch sang tiếng Việt, việc b ạn học b ộ thư viện này sẽ thật s ự dễ dàng. Nó cần thiết khi bạn quan tâm tớ i. V ớ i nguồn tài liệu Ti ếng Việt s ẽ rất c ần thiết để việc học của bạn trở nên dễ dàng hơ n rất nhiều. Biên dịch tài liệu này vớ i code mẫu sẽ giúp bạn thật sự dễ hiểu và có thể tự học một cách hiệu quả, đạt kết quả như mong muốn. Khi hoàn thành đề này, các sinh viên viên, các l ập trình viên Việt Nam có th ể dễ dàng sử dụng bộ thư viện OpenCV để viết ra các phần mềm ứng dụng như đã nêu trên, nhanh chóng đón bắt công nghệ thế giớ i.
4
6. Thự c trạng và khảo sát về bộ thư viện nguồn mở OpenCV: 6.1. Thự c trạng: - Nguồn tài liệu Tiếng Việt về OpenCV hiện nay rất hiếm, phần lớ n tài liệu là bằng tiếng Anh, gây nhiều khó khăn trong cho sinh viên muốn học hoặc ứng dụng. Trên các di ễn đàn hay website cũng có rất nhiều đề tài nói về OpenCV. Ví dụ như http://khoinguonit.com/f93/ , http://www.ieev.org/ ... Nhưng hầu hết các trang này đều không có tài li ệu thống nhất về OpenCV tiếng Việt mà chỉ có một số tài liệu đơ n lẻ, hoặc tài liệu bằng tiếng Anh. Ở các trườ ng đại học cũng t ươ ng tự là tài liệu học t ập cho sinh viên đều là tiếng Anh. Sinh viên Việt Nam muốn kh ở i đầu việc nghiên cứu đều phải g ặp r ất nhiều khó khăn do rào cản ngôn ngữ (Tiếng Anh), việc hiểu một thuật ngữ mang tính kỹ thuật vớ i một ngườ i mớ i rất mất thờ i gian và không bao giờ là dễ dàng.
6.2. Khảo sát: Phiếu khảo sát đã phát ra là 60 phi ếu và thu về đượ c 56 phiếu. Dướ i đây là biểu đồ chi tiết các câu hỏi khảo sát đượ c.
1. Bạn có quan tâm về Robot không? 3 11%
1 30%
2 59%
1. Không 2. Có, nhưng không nhiều 3. Rất quan tâm
5
2. Bạn có quan tâm về công nghệ nhận dạng khuôn mặt ngườ i bằng máy tính? 3 7%
1 21%
2 72%
1. Không 2. Có, nhưng không nhiều 3. Rất quan tâm
3. Bạn có biết Thị giác máy tính? (3) 0% 1 41% 2 59%
1. Chưa từng nghe qua 2. Có nghe qua 6
3. Đang tìm hiểu
4. Đây là công nghệ nhận dạng máy tính, bạn quan tâm tớ i nó chứ?
3 18%
1 20%
2 62%
1. Không 2. Cũng chỉ biết qua 3. Rất quan tâm
5. Những ứng dụng của bộ thư viện này mà bạn biết?
1 31%
4 41%
3 5%
2 23%
1. Không 7
2. Xử lí màu sắc và độ phân giải 3. An ninh (camera thông minh, nhân dạng) 4. Cả 2 và nhiều ứng dụng khác nữa
6. Đã bao giờ bạn tìm kiếm tài liệu tự học về một bộ nguồn thư viện nào?
3 29%
1 34%
2 37%
1. Chưa bao giờ 2. Chỉ đọc qua cho biết 3. Chắc chắn rồi
6b. Bạn muốn tự học bộ thư viện này chứ? 3 16%
1 14%
2 70%
8
4. Không 5. Cũng muốn thử qua 6. Rất muốn
7. Nếu học, bạn muốn nguồn tài hướ ng dẫn bằng Tiếng Việt chứ? 2 7%
1 93%
1. Tất nhiên 2. Không quan tâm
8. Tài liệu về thư viện này bằng Tiếng Việt có nhiều không? 3 9%
1 29%
2 62%
9
1. Không biết 2. Ít 3. Nhiều
9. Bạn có tìm kiếm tài liệu liên quan đến bộ thư viện không? 4 3% 1 27% 3 43% 2 27%
1. 2. 3. 4.
Không Cũng thỉnh thoảng Khi nào cần mớ i tìm Thườ ng xuyên
10
10. Nguồn tài liệu Tiếng Việt về nó rất hiếm, bạn có nhiều không? 3 5% 1 32%
2 63%
1. Không 2. Có, nhưng ít 3. Nhiều
11. Bạn muốn đọc tài liệu về OpenCV bằng ngoại ngữ hay bằng tiếng Việt? 3 1 5% 11%
2 84%
1. Không quan tâm 2. Tức nhiên là Ti ếng Việt 3. Sao cũng đượ c 11
12. Bạn đã từng lập trình vớ i thư viện OpenCV này chưa? 4 12% 3 16% 1 58%
2 14%
1. 2. 3. 4.
Chưa bao giờ Chỉ mớ i thử qua Cũng thỉnh thoảng Thườ ng xuyên
13. Nếu bạn đã từng lập trình vớ i thư viện OpenCV, bạn có gặp khó vớ i cách dùng các hàm trong OpenCV khi tài liệu bằng tiếng Anh?
3 11%
4 5%
2 11% 1 73%
1. Chưa từng lập trình vớ i nó 12
2. Không 3. Cũng không khó lắm 4. Quá khó khăn
14. Việc chúng tôi biên dịch nguồn tài liệu này sang Tiếng Việt bạn thấy thế nào? 3 14%
1 33%
2 53%
1. Mình không quan tâm 2. Cũng đượ c đấy 3. Rất có ích
13
14
Phần II. Quy trình th ự c hiện: - Từ 5/9/2011 đến 1/10/2011: Xác định đề tài nghiên cứu và đăng kí đề tài - T ừ 3/10/2011 đến 22/10/2011: Biên soạn đề cươ ng nghiên cứu, phát bảng khảo sát và thống kê kết quả khảo sát. - Từ 24/10/2011 đến 25/12/2011: Thực hiện sản phẩm: Lọc nguồn tài liệu cần dịch từ nguồn tài liệu nướ c ngoài Chia nội dung cần dịch ra các ch ươ ng, phần, hàm cụ thể và sắp xếp Duyệt sơ lượ t các toàn b ộ các phần đã chọn và sắp xếp lại lần nữa Bắt đầu dịch toàn bộ theo thứ tự đã xếp. Công cụ hỗ trợ : translate.google.com.vn, tratu.soha.vn, vdict.com 5. Sau khi dịch xong, đọc lại để sửa lỗi. 6. Đóng gói sản phẩm, đem đi in. 1. 2. 3. 4.
- Từ 25/12/2011: Nộp bài về cho khoa.
15
Phần III. Tổng kết
Tài liệu tham khảo: - OpenCV Reference Manual v2.1 http://www.box.com/s/l8pq7x8q1ktf ecbatfv - Learning OpenCV: computer visi on with the OpenCV library http://books.google.com/books?id=s AgiOfu2EIC&lpg=PP1&hl=vi&pg=PA364#v=onepage& q&f=false Tác giả: Gary Bradski, Adrian Kaehl r - Algorithms for Image Processing and Computer Vision http://books.google.com/books?id=BK3oXzpxC44C&lpg=PP1&dq=related%3AISBN059651 6134&hl=vi&pg=PA15#v=onepage q&f=false Tác giả: J. R. Parker Trang chủ: http://opencv.willowgara e.com
Giớ i thiệu về OpenCV: - OpenCV là viết t t của Open Sour e Computer Vision. Đó là một thư viện nguồn mở để lập trình gồm nhiều hàm C và một s ố lớ C++ dựa trên thuật toán phổ biến trong xử í ảnh và thị giác máy tính. -Bộ thư viên này còn đượ c viết trên ngôn ngữ Python và Java. Lập trình đượ c trên nhiều nền tản: Windows, Linux, Android và M c - OpenCV cung cấp rất nhiều kiểu d liệu có cấu trúc nhằm hỗ trợ tối việc xử lí. Ứ ng dụng công nghệ nhận dạng :
- Hiệu chỉnh và phục chế ảnh 16
- Xử lí màu sắc và độ phân giải ảnh - Xử lí hình trạng và phân tách chi tiết - Tái dựng ảnh ba chiều và diễn giải ảnh - Nhận dạng và giám sát thực thể - Y khoa (chẩn đoán, giải phẫu) - An ninh (camera thông minh, nhận dạng) - Giao thông (theo dõi lưu thông, điều khiển xe) - Tự động hóa sản xuất (đo lườ ng, kiểm định chất lượ ng) và v.v…
Kinh nghiệm: Trong quá trình thực hiện đề tài, số từ vựng tiềng Anh của tôi đã tăng lên, thêm đượ c nhiều từ vựng mớ i, đặc biệt là các từ chuyên ngành công ngh ệ thông tin. Tôi đượ c biết về quy trình đề thực hiện một đề tài nghiên cứu khoa học, viết báo cáo tổng kết đề nghiên cứu khoa học.
Hướ ng phát triển của đề tài: Bộ thư viện OpenCV ứng dụng đượ c trong rất nhiều ngành nghề khác nhau, như an ninh trong việc nhận dạng vân tay, đối tượ ng, tiết kiệm rất nhiều thờ i gian và công s ức thay cho con ngườ i, nâng cao hiệu quả công việc. Chế tạo robot tự động hóa. Xử lí, phục chế hình ảnh trong siêu âm… Rất nhiều ứng d ụng phục v ụ con ngườ i, đây là sự đón đầu công nghệ thế giớ i cho Việt Nam. Tài liệu hướ ng dẫn sử dụng OpenCV này sẽ tạo đòn bẩy đưa công nghệ tươ ng lai về vớ i Việt Nam. Như đã nói, các l ập trình viên Việt Nam sẽ sử dụng tài liệu hướ ng dẫn sử dụng bộ thư viện OpenCV viết các phần mềm ứng dụng cao cấp trên, phục v ụ cho cuộc sống, phát triển đất nướ c. Trong thờ i gian tớ i, tôi sẽ tiếp tục hoàn thiện bộ tài hướ ng dẫn này hơ n nữa, nâng cấp bộ tài liệu này theo các phiên bản OpenCV mớ i hơ n, tiếp tục làm bộ tài liệu hướ ng dẫn cho OpenCV C++ API, java. Bộ tài liệu này sẽ đượ c chia sẻ miễn phí hoàn trên mạng, để mọi ngườ i đều đượ c s ử dụng d ễ dàng đóng góp, hoàn thiện nó hơ n nữa. Mọi ngườ i cũng có thể chia sẻ kiến thức, kinh nghiệm lập trình vớ i OpenCV, cộng đồng cùng nhau phát triển và phát triển đất nướ c.
17
18
Tài liệu hướ ng dẫn sử sụng OpenCV v2.1 Mục lục: Chươ ng 1: cxcore. Hàm cốt lõi………………………………………………………………….. 1.1 Các Struct cơ bản……………………………………………………………………………….. 1.2 Hoạt động trên mảng………………………………………………………………………….. 1.3 Cấu trúc động……………………………………………………………………………………... 1.4 Các hàm vẽ…………………………………………………………………………………………. 1.5 XML/YAML Persistence…………………………………………………………………… 1.6 Phân nhóm và Tìm ki ếm trong không gian đa chiều…………………………. Chươ ng 2: cv. Xử lý hình ảnh và thị giác máy tính…………………………………. 2.1 Lọc hình ảnh………………………………………………………………………………………. 2.2 Ảnh hình học biến đổi………………………………………………………………………… 2.3 Hình ảnh hỗn hợ p biến đổi………………………………………………………………… 2.4 Biểu đồ…………………………………………………………………………………..……………. Chươ ng 3: cvaux. Các hàm m ở rộng của Thị Giác Máy Tính…..……………. Chươ ng 4: highgui. Cao c ấp giao diện và I/O…..………………..………………..……. 4.1 Giao diện ngườ i dùng…..………………..………………..………………..………………… 4.2 Đọc / ghi hình ảnh và video…..………………..………………..………………..………..
20 20 27 59 86 94 111 113 113 121 128 142 152 153 153 157
19
Chươ ng 1: cxcore. Hàm cốt lõi 1.1 Các Struct cơ bản CvPoint 2D điểm vớ i số nguyên tọa độ (thườ ng là zero-based). typedef struct CvPoint { int x; int y; } CvPoint; x x-phối hợ p y y-phối hợ p / * Constructor * / inline CvPoint cvPoint( int x, int y ); / * Chuyển đổi từ CvPoint2D32f * / inline CvPoint cvPointFrom32f( CvPoint2D32f point ); CvPoint2D32f 2D điểm vớ i tọa độ điểm nổi typedef struct CvPoint2D32f { float x; float y; } CvPoint2D32f; x x-phối hợ p y y-phối hợ p / * Constructor * / inline CvPoint2D32f cvPoint2D32f (double x, double y); / * Chuyển đổi từ CvPoint * / inline CvPoint2D32f cvPointTo32f( CvPoint point ); CvPoint3D32f 3D điểm vớ i tọa độ điểm nổi typedef struct CvPoint3D32f { float x; float y; float z; } CvPoint3D32f; x x-phối hợ p y y-phối hợ p z z-phối hợ p / * Constructor * / 20
inline CvPoint3D32f cvPoint3D32f( double x, double y, double z ); CvPoint2D64f 2D điểm vớ i tọa độ điểm độ chính xác kép nổi typedef struct CvPoint2D64f { double x; double y; } CvPoint2D64f; x x-phối hợ p y y-phối hợ p / * Constructor * / inline CvPoint2D64f cvPoint2D64f( double x, double y ); / * Chuyển đổi từ CvPoint * / inline CvPoint2D64f cvPointTo64f( CvPoint point ); CvPoint3D64f 3D điểm vớ i tọa độ điểm độ chính xác kép nổi typedef struct CvPoint3D64f { double x; double y; double z; } CvPoint3D64f; x x-phối hợ p y y-phối hợ p z z-phối hợ p / * Constructor * / inline CvPoint3D64f cvPoint3D64f( double x, double y, double z ); CvSize Pixel chính xác kích th ướ c của hình chữ nhật. typedef struct CvSize { int width; int height; } CvSize; Chiều rộng chiều rộng của hình chữ nhật Chiều cao chiều cao của hình chữ nhật / * Constructor * / inline CvSize cvSize( int width, int height ); CvSize2D32f Sub-pixel chính xác kích th ướ c của hình chữ nhật. 21
typedef struct CvSize2D32f { float width; float height; } CvSize2D32f; Chiều rộng chiều rộng của hình chữ nhật Chiều cao chiều cao của hình chữ nhật / * Constructor * / inline CvSize2D32f cvSize2D32f( double width, double height ); CvRect Bù đắp (thườ ng là góc trên bên trái) và kích th ướ c của hình chữ nhật. typedef struct CvRect { int x; int y; int width; int height; } CvRect; x x-phối hợ p của các góc trên cùng, bên trái y y-phối hợ p của góc trên bên trái (phía d ướ i bên trái cho Windows bitmap ) Chiều rộng chiều rộng của hình chữ nhật Chiều cao chiều cao của hình chữ nhật / * Constructor * / inline CvRect cvRect( int x, int y, int width, int height ); CvScalar Một container cho 1, 2, 3 - 4-tuples c ủa đôi. typedef struct CvScalar { double val[4]; } CvScalar; / * Constructor: khở i tạo val [0] vớ i val0, val [1] vớ i val1. * / inline CvScalar cvScalar( double val0, double val1=0, double val2=0, double val3=0 ); / * Constructor: khở i tạo tất cả của val [0] ... val [3] v ớ i val0123 * / inline CvScalar cvScalarAll( double val0123 ); / * Constructor: khở i tạo val [0 vớ i val0, và tất cả các val [1] ... val [3] v ớ i số không * / inline CvScalar cvRealScalar( double val0 ); 22
CvTermCriteria Tiêu chí chấm dứt cho lặp đi lặp lại các thuật toán. #define CV_TERMCRIT_ITER 1 #define CV_TERMCRIT_NUMBER CV_TERMCRIT_ITER #define CV_TERMCRIT_EPS 2 typedef struct CvTermCriteria { int type; int max_iter; double epsilon; } CvTermCriteria; type Một sự kết hợ p của CV_TERMCRIT ITER và CV_TERMCRIT EPS max_iter số lần lặp tối đa epsilon yêu cầu độ chính xác / * Constructor * / inline CvTermCriteria cvTermCriteria( int type, int max_iter, double epsilon ); / * Kiểm tra và chuyển đổi một CvTermCriteria để type = CV_TERMCRIT_ITER + CV_TERMCRIT_EPS và cả hai max_iter và epsilon là h ợ p lệ * / CvTermCriteria cvCheckTermCriteria( CvTermCriteria criteria, double default_eps, int default_max_iters ); CvMat Một ma trận đa kênh. typedef struct CvMat { int type; int step; int* refcount; union { uchar* ptr; short* s; int* i; float* fl; double* db; } data; #ifdef __cplusplus union { int rows; int height; }; union { int cols; 23
int width; }; #else int rows; int cols; #endif } CvMat; type gõ chữ ký CvMat (CV MAT MAGIC VAL) có ch ứa các loại của các yếu tố và cờ step hàng chiều dài theo byte refcount Bên dướ i tham chiếu truy cập dữ liệu data Con trỏ dữ liệu để các dữ liệu ma trận thực tế rows Số hàng của hàng cols Số cột của cột Ma trận đượ c lưu trữ hàng bở i hàng. Tất cả các hàng đượ c liên kết bở i 4 byte. CvMatND Đa chiều đa kênh mảng dày đặc. typedef struct CvMatND { int type; int dims; int* refcount; union { uchar* ptr; short* s; int* i; float* fl; double* db; } data; struct { int size; int step; } dim[CV_MAX_DIM]; } CvMatND; type loại chữ ký CvMatND (CV MATND MAGIC VAL), kết hợ p các loại của các yếu tố và cờ dims làm mờ số của kích thướ c mảng refcount Bên dướ i tham chiếu truy cập dữ liệu data Con trỏ dữ liệu để các dữ liệu ma trận thực tế dim mờ Đối vớ i mỗi chiều, cặp đôi này (số yếu tố, khoảng cách giữa các thành ph ần trong byte ) CvSparseMat Multi-chiều thưa thớ t mảng đa kênh. 24
typedef struct CvSparseMat { int type; int dims; int* refcount; struct CvSet* heap; void** hashtable; int hashsize; int total; int valoffset; int idxoffset; int size[CV_MAX_DIM]; } CvSparseMat; type loại chữ ký CvSparseMat (CV_SPARSE_MAT_MAGIC_VAL), kết hợ p các loại c ủa các yếu tố và cờ . dims Số mờ của kích thướ c refcount Bên dướ i tham chiếu truy cập. Không đượ c sử dụng. heap Một đống hồ bơ i của các nút bảng băm hashtable Các bảng băm. Mỗi mục là một danh sách các nút. hashsize Kích thướ c của bảng băm total tổng của các nút mảng thưa thớ t valoffset giá tr ị bù đắp của các nút mảng, theo byte idxoffset Chỉ số bù đắp của các nút mảng, theo byte size mảng có kích thướ c kích thướ c IplImage IPL hình ảnh tiêu đề typedef struct _IplImage { int nSize; int ID; int nChannels; int alphaChannel; int depth; char colorModel[4]; char channelSeq[4]; int dataOrder; int origin; int align; int width; int height; struct _IplROI *roi; struct _IplImage *maskROI; void *imageId; struct _IplTileInfo *tileInfo; int imageSize; char *imageData; 25
int widthStep; int BorderMode[4]; int BorderConst[4]; char *imageDataOrigin; } IplImage; nSize sizeof(IplImage) ID Phiên bản, luôn luôn bằng 0 nChannels Số của các kênh. Hầu hết các Hàm OpenCV hỗ trợ 1-4 kênh. alphaChannel bị bỏ qua bở i OpenCV depth kênh sâu trong bit + bit dấu tùy chọn (IPL SIGN chiều sâu) . Hỗ trợ độ sâu là: IPL_DEPTH_8U Unsigned số nguyên 8-bit IPL_DEPTH_8S Đăng ký số nguyên 8-bit IPL_DEPTH_16U Unsigned số nguyên 16-bit IPL_DEPTH_16S Đăng ký số nguyên 16-bit IPL_DEPTH_32S Đăng ký số nguyên 32-bit IPL_DEPTH_32F đơ n chính xác nổi IPL_DEPTH_64F độ sâu chính xác điểm nổi Double-64F colorModel Bỏ qua OpenCV. Hàm OpenCV CvtColor yêu c ầu nguồn và destination màu không gian như các thông số. channelSeq bị bỏ qua bở i OpenCV dataOrder 0 = IPL_DATA_ORDER_PIXEL - kênh màu xen k ẽ, 1 màu sắc riêng biệt kênh. CreateImage ch ỉ tạo ra hình ảnh vớ i các kênh xen k ẽ. Ví dụ, thông thườ ng bố trí của một hình ảnh màu sắc là: b00g00r00b10g10r10 ... origin nguồn gốc 0 - gốc trên bên trái, 1 - d ướ i bên trái có nguồn gốc (Windows bitmap phong cách ) align sắp xếp sắp các dòng hình ảnh (4 hoặc 8) . OpenCV bỏ qua điều này và sử dụng widthStep thay vì. width Ảnh rộng chiều rộng tính bằng pixel height Ảnh cao chiều cao tính bằng pixel roi khu vực quan tâm (ROI). N ếu không phải là NULL, chỉ có khu vực này hình ảnh s ẽ đượ c xử lý. maskROI Phải đượ c NULL trong OpenCV imageId Phải đượ c NULL trong OpenCV tileInfo Phải đượ c NULL trong OpenCV imageSize ảnh kích thướ c dữ liệu theo byte. Đối vớ i dữ liệu xen kẽ, bằng hình ảnh-> chiều cao mage-> widthStep imageData Một con trỏ vào các dữ liệu hình ảnh liên kết widthStep Kích thướ c của một dòng hình ảnh liên kết, trong byte BorderMode biên giớ i hoàn thành chế độ, bị bỏ qua bở i OpenCV BorderConst biên giớ i hoàn thành chế độ, bị bỏ qua bở i OpenCV imageDataOrigin Một con trỏ đến nguồn g ốc của d ữ liệu hình ảnh (không nhất thiết phải phù hợ p). Đây là đượ c sử dụng cho deallocation hình ảnh. Của IplImage c ấu trúc đượ c thừa kế từ Thư viện xử lý hình ảnh của Intel, trong đó 26
định dạng có nguồn gốc. OpenCV chỉ hỗ trợ một t ập hợ p con của các định dạng IplImage có thể , như đượ c nêu trong tham số danh sách trên. Ngoài ra các h ạn chế trên, OpenCV xử lý ROIs khác nhau. OpenCV Hàm yêu cầu rằng kích thướ c hình ảnh hoặc kích c ỡ ROI của tất cả các nguồn và hình ảnh điểm đến phù hợ p chính xác. Trên Mặt khác, ảnh xử lý Intel Thư viện xử lý khu vực giao nhau giữa các hình ảnh nguồn và đích đến (hoặc ROIs), cho phép họ thay đổi một cách độc lập.
CvArr Tùy tiện mảng typedef void CvArr; CvArr metatype ch ỉ đượ c sử dụng như một tham số Hàm để xác định rằng Hàm chấp nhận mảng của nhiều loại, chẳng hạn như IplImage, CvMat * hoặc thậm chí CvSeq * đôi khi. Các cụ thể loại mảng đượ c xác định tại thờ i gian chạy bằng cách phân tích 4 byte đầu tiên c ủa tiêu đề.
1.2 Hoạt động trên mảng cvAbsDiff Tính khác biệt tuyệt đối giữa hai mảng. void cvAbsDiff(const CvArr* src1, const CvArr* src2, CvArr* dst); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai dst Các mảng đích Hàm tính toán sự khác biệt tuyệt đối giữa hai mảng. Tất c ả các mảng phải có cùng một ki ểu d ữ liệu và kích thướ c t ươ ng tự (hoặc thu nhập từ đầu kích thướ c). cvAbsDiffS Tính khác biệt tuyệt đối giữa các mảng và một vô hướ ng. void cvAbsDiffS(const CvArr* src, CvArr* dst, CvScalar value); #define cvAbs(src, dst) cvAbsDiffS(src, dst, cvScalarAll(0)) src Các mảng nguồn dst Các mảng đích value Các vô h ướ ng Hàm tính toán sự khác biệt tuyệt đối giữa các mảng và một vô hướ ng. Tất c ả các mảng phải có cùng một ki ểu d ữ liệu và kích thướ c t ươ ng tự (hoặc thu nhập từ đầu kích thướ c). cvAdd Tính toán số tiền cho mỗi phần tử của hai mảng. void cvAdd(const CvArr* src1, const CvArr* src2, 27
CvArr* dst, const CvArr* mask=NULL); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai dst Các mảng đích mask mặt nạ hoạt động, 8-bit kênh mảng; quy định cụ thể các yếu tố của mảng đích đượ c thay đổi Hàm bổ sung thêm một mảng khác: dst(I)=src1(I)+src2(I) if mask(I)!=0 Tất cả các mảng phải có cùng loại, trừ mặt nạ, và kích thướ c tươ ng t ự (hoặc kích thướ c ROI). Đối vớ i loại có phạm vi giớ i hạn hoạt động này là bão hòa. cvAddS Tính tổng của một mảng và một vô hướ ng. void cvAddS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL); src Các mảng nguồn value vô hướ ng dst Các mảng đích mask mặt nạ hoạt động, 8-bit kênh mảng; quy định cụ thể các yếu t ố của mảng đích đượ c thay đổi Hàm bổ sung thêm một giá trị vô hướ ng để mọi phần t ử trong mảng nguồn src1 và lưu tr ữ kết quả trong dst. Đối vớ i các loại có phạm vi giớ i hạn hoạt động này là bão hòa. dst(I)=src(I)+value if mask(I)!=0 Tất cả các mảng phải có cùng loại, trừ mặt nạ, và kích thướ c tươ ng tự (hoặc kích thướ c ROI). cvAddWeighted Tính toán tổng trọng số của hai mảng. void cvAddWeighted(const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst); src1 Các mảng nguồn đầu tiên alpha Trọng lượ ng cho các phần tử mảng đầu tiên src2 Các mảng nguồn thứ hai beta Trọng lượ ng cho các phần tử mảng thứ hai dst Các mảng đích gamma vô hướ ng, thêm vào s ố tiền mỗi Hàm tính toán t ổng hợ p có trọng số của hai mảng như sau: dst(I)=src1(I)*alpha+src2(I)*beta+gamma Tất cả các mảng phải có cùng loại và kích th ướ c t ươ ng tự (hoặc kích thướ c ROI). Đối vớ i các loại có hạn chế phạm vi hoạt động này đượ c bão hòa. 28
cvAnd Tính toán cho mỗi phần tử bit-khôn ngoan kết hợ p của hai mảng. void cvAnd(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai dst Các mảng đích mặt nạ mặt nạ hoạt động, 8-bit kênh mảng; quy định cụ thể các yếu tố của mảng đích đượ c thay đổi Hàm tính toán cho mỗi phần tử bit-khôn ngoan kết hợ p hợ p lý của hai mảng: dst(I)=src1(I)&src2(I) if mask(I)!=0 Trong trườ ng hợ p mảng điểm nổi đại diện bit đượ c sử dụng cho hoạt động. Tất cả các mảng phải có cùng loại, trừ mặt nạ, và kích th ướ c giống nhau. cvAndS Tính toán kết hợ p khôn ngoan-bit cho mỗi phần tử của một mảng và một vô hướ ng. void cvAndS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL); src Các mảng nguồn value vô hướ ng để sử dụng trong hoạt động dst Các mảng đích mask mặt nạ hoạt động, 8-bit kênh mảng; quy định cụ thể các yếu t ố của mảng đích đượ c thay đổi Hàm tính toán k ết hợ p khôn ngoan-bit cho mỗi phần tử của một mảng và một vô hướ ng: dst(I)=src(I)&value if mask(I)!=0 Trướ c khi hoạt động thực tế, vô hướ ng đượ c chuyển đổi cùng loại như của mảng (s). Trong trườ ng hợ p của các mảng đại diện của họ bit floating-point đượ c sử dụng cho hoạt động. Tất cả các mảng phải có cùng loại, trừ mặt nạ, và kích thướ c giống nhau. Các mẫu sau đây sẽ chứng minh làm thế nào để tính giá trị tuyệt đối c ủa m ảng floating-point các yếu tố bằng cách thanh toán bù trừ các bit có ý ngh ĩ a nhất: float a[] = { -1, 2, -3, 4, -5, 6, -7, 8, -9 }; CvMat A = cvMat(3, 3, CV\_32F, &a); int i, absMask = 0x7fffffff; cvAndS(&A, cvRealScalar(*(float*)&absMask), &A, 0); for(i = 0; i < 9; i++ ) printf("%.1f ", a[i]); Mã nên in: 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 cvAvg Tính trung bình (trung bình) của các phần tử mảng. CvScalar cvAvg(const CvArr* arr, const CvArr* mask=NULL); arr Mảng 29
mask Mặt nạ mặt nạ hoạt động tùy chọn Hàm tính toán M giá trị trung bình của các ph ần tử mảng, độc lập cho mỗi kênh:
Nếu mảng là IplImage và COI đượ c thiết lập, Hàm xử lý các kênh đượ c lựa chọn chỉ và các cửa hàng trung bình S0 thành phần đầu tiên vô hướ ng. cvAvgSdv Tính trung bình (trung bình) của các phần tử mảng. void cvAvgSdv(const CvArr* arr, CvScalar* mean, CvScalar* stdDev, const CvArr* mask=NULL); arr Mảng mean là Con trỏ trỏ tớ i các giá tr ị trung bình đầu ra, có thể đượ c NULL nếu nó không phải là cần thiết stdDev Pointer đến độ lệch chuẩn đầu ra Mặt nạ mặt nạ hoạt động tùy chọn Hàm tính toán độ lệch giá trị và tiêu chuẩn trung bình của các phần tử mảng, independently cho mỗi kênh:
Nếu mảng là IplImage và COI đượ c thiết l ập, Hàm xử lý các kênh đượ c lựa chọn chỉ và các cửa hàng trung bình và độ lệch tiêu chuẩn để các thành ph ần đầu tiên của vô hướ ng đầu ra (mean0 và stdDev0). cvCalcCovarMatrix Tính ma trận hiệp phươ ng sai của một tập các vectơ . void cvCalcCovarMatrix(const CvArr** vects, int count, CvArr* covMat, CvArr* avg, int flags); vects vector đầu vào, tất cả đều phải có cùng loại và kích thướ c giống nhau . Các vectơ không có đượ c 1D, họ có thể đượ c 2D (ví dụ, hình ảnh) ... count số của vectơ đầu vào covMat ma trận hiệp phươ ng sai đầu ra nên đượ c thả nổi điểm và vuông avg đầu vào hay đầu ra (tùy thuộc vào những lá cờ ) m ảng - trung bình (trung bình) vector c ủa đầu vào vector flags cờ hoạt động, một sự kết hợ p của các giá trị sau CV_COVAR_SCRAMBLED tranh giành ma tr ận hiệp phươ ng sai đầu ra đượ c tính như sau : 30
scale * [vects[0] - avg, vects[1] – avg,…] T .[vects[0] – avg, vects[1] – avg,…], Đó là, ma tr ận hiệp phươ ng sai số count x count. Như một ma trận hiệp ph ươ ng sai bất thườ ng đượ c s ử dụng để nhanh chóng PCA của một tập hợ p các vector rất lớ n (xem, ví dụ, EigenFaces kỹ thuật nhận diện khuôn mặt). Giá trị riêng của ma trận này "tranh giành" sẽ phù hợ p v ớ i giá trị riêng của ma trận hiệp phươ ng sai sự thật và "true" eigenvectors có th ể dễ dàng tính từ các eigenvectors c ủa ma trận "tranh giành" hiệp phươ ng sai. CV_COVAR_NORMAL ma trận hiệp phươ ng sai đầu ra đượ c tính như sau: scale * [vects[0] - avg, vects[1] – avg,…] .[vects[0] – avg, vects[1] – avg,…] T , Đó là, covMat sẽ là một ma trận hiệp phươ ng sai vớ i kích thướ c tuyến tính tươ ng tự như tổng số phần tử trong mỗi vector đầu vào. Một và chỉ có một CV_COVAR_SCRAMBLED và CV_COVAR_NORMAL phải đượ c xác định CV_COVAR_USE_AVG Nếu lá cờ đượ c quy định cụ thể Hàm không tính toán avg vector đầu vào, nhưng thay vào đó, sử dụng vector avg thông qua. Điều này là hữu ích nếu avg đã đượ c đã đượ c tính toán b ằng cách nào đó, hoặc n ếu ma trận hi ệp ph ươ ng sai đượ c tính bở i các bộ phận trong trườ ng hợ p, avg là không ph ải là một vector có ngh ĩ a là đầu vào thiết lập của vectơ , mà là giá tr ị trung bình vector c ủa toàn bộ thiết lập. CV_COVAR_SCALE Nếu lá cờ đượ c quy định cụ thể, ma trận hiệp phươ ng sai đượ c thu nhỏ. Trong "bình thườ ng" chế độ quy mô '1 / số, quy mô "tranh giành" chế độ đối ứng trong tổng số số phần tử trong mỗi vector đầu vào. Theo mặc định (nếu cờ không đượ c chỉ định) ma trận hiệp phươ ng sai không phải là quy mô ('quy mô = 1'). CV_COVAR_ROWS Có ngh ĩ a là tất cả các vectơ đầu vào đượ c lưu trữ như các hàng của một ma trận duy nhất, vects [0].count đượ c bỏ qua trong trườ ng hợ p này, và avg phải là một vector đơ n hàng của một thích hợ p kích thướ c. CV_COVAR_COLS Có ngh ĩ a là tất cả các vectơ đầu vào đượ c l ưu tr ữ như các cột c ủa một ma trận duy nhất, vects [0]. số đượ c bỏ qua trong trườ ng hợ p này, và avg phải là một vector cột duy nhất của một kích thướ c thích hợ p. Hàm tính toán ma tr ận hiệp phươ ng sai, và tùy chọn, vector trung bình c ủa tập hợ p các đầu vào vector. Hàm này có th ể đượ c sử dụng cho PCA, để so sánh vector sử dụng khoảng cách Mahalanobis và vv. cvCartToPolar Tính cườ ng độ và/hoặc góc của vector 2D. void cvCartToPolar( const CvArr* x, const CvArr* y, CvArr* magnitude, CvArr* angle=NULL, int angleInDegrees=0); x Các mảng của x-tọa độ y Các mảng của y-tọa độ magnitude độ lớ n mảng đích của độ lớ n, có thể đượ c thiết l ập để NULL nếu nó không phải là cần thiết angle góc mảng đích của góc độ, có thể đượ c thiết lập để NULL nếu nó không phải là cần thiết. Các góc là đo bằng radian (0-2) hoặc ở các mức độ (từ 0 đến 360 độ). angleInDegrees Lá c ờ cho biết các góc đượ c đo bằng radian, là chế độ lỗi, hoặc ở các mức độ Hàm tính toán độ lớ n, góc, hoặc cả hai của tất cả các vector 2d (x (I), y (I)): 31
magnitude(I)=sqrt(x(I)ˆ2ˆ+y(I)ˆ2ˆ ), angle(I)=atan(y(I)/x(I) ) Các góc đượ c tính toán vớ i 0.1 độ chính xác. Đối vớ i điểm (0,0), góc đượ c thiết lập là 0. cvCbrt Tính gốc khối float cvCbrt(float value); value Giá trị đầu vào giá tr ị dấu chấm động Hàm tính toán căn khối của các đối số, và thông thườ ng nó là nhanh h ơ n so vớ i pow (giá trị, 1 / 3.). Ngoài ra, lập luận tiêu cực đượ c xử lý đúng cách. Giá trị đặc biệt (NaN) không đượ c xử lý. cvClearND Xóa một phần tử mảng cụ thể. void cvClearND(CvArr* arr, int* idx); arr đầu vào mảng idx mảng của các chỉ số thành phần CvClearND Hàm xóa bộ để không một yếu tố cụ thể của một mảng dày đặc hoặc xóa các phần tử của một mảng thưa thớ t. Nếu phần tử mảng thưa thớ t không tồn tại, Hàm không có gì. cvCloneImage Làm cho một bản sao đầy đủ của một hình ảnh, bao gồm tiêu đề, dữ liệu, và ROI. IplImage* cvCloneImage(const IplImage* image); image hình ảnh ban đầu Trả lại IplImage * điểm cho các bản sao hình ảnh. cvCloneMat Tạo một bản sao ma trận đầy đủ. CvMat* cvCloneMat(const CvMat* mat); mat ma trận để đượ c sao chép Tạo một bản sao đầy đủ của một ma trận và trả về một con trỏ để sao chép các. cvCloneMatND Tạo bản sao đầy đủ của một mảng đa chiều và trả về một con trỏ để sao chép các. CvMatND* cvCloneMatND(const CvMatND* mat); mat đầu vào mảng cvCloneSparseMat Tạo bản sao đầy đủ của mảng thưa thớ t. CvSparseMat* cvCloneSparseMat(const CvSparseMat* mat); mat đầu vào mảng Hàm này tạo ra một bản sao của mảng đầu vào và trả về con trỏ để sao chép. cvCmp Thực hiện mỗi phần tử so sánh của hai mảng. void cvCmp(const CvArr* src1, 32
const CvArr* src2, CvArr* dst, int cmpOp); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai. Cả hai mảng nguồn phải có một kênh duy nhất. dst Mảng đích, phải có loại 8u hoặc 8s cmpOp Các cờ xác định mối quan hệ giữa các yếu tố để đượ c kiểm tra CV_CMP_EQ src1 (I) "bằng" giá trị CV_CMP_GT src1 (I) "quá mức" giá trị CV_CMP_GE src1 (I) lớ n hơ n hoặc bằng giá trị CV_CMP_LT src1 (I) "thấp hơ n" giá trị CV_CMP_LE src1 (I) "ít hơ n hoặc bằng giá trị CV_CMP_NE src1 (I) "không bằng" giá trị Hàm so sánh các yếu tố tươ ng ứng của hai mảng và điền vào các mặt nạ đích mảng: dst(I)=src1(I) op src2(I), dst (I) đượ c thiết lập để 0xff (tất cả 1-bit) nếu mối quan hệ cụ thể giữa các yếu tố là đúng và 0 khác. Tất cả các mảng phải có cùng loại, trừ điểm đến, và kích th ướ c t ươ ng tự (hoặc ROI kích thướ c) cvCmpS Thực hiện so sánh mỗi phần tử của một mảng và một vô hướ ng. void cvCmpS(const CvArr* src, double value, CvArr* dst, int cmpOp); src mảng nguồn, phải có một kênh duy nhất value giá trị vô hướ ng để so sánh từng phần tử mảng dst Mảng đích, phải có loại 8u hoặc 8s cmpOp Các cờ xác định mối quan hệ giữa các yếu tố để đượ c kiểm tra CV_CMP_EQ src1 (I) "bằng" giá trị CV_CMP_GT src1 (I) "quá mức" giá trị CV_CMP_GE src1 (I) lớ n hơ n hoặc bằng giá trị CV_CMP_LT src1 (I) "thấp hơ n" giá trị CV_CMP_LE src1 (I) "ít hơ n hoặc bằng giá trị CV_CMP_NE src1 (I) "không bằng" giá trị Hàm so sánh các yếu tố tươ ng ứng của một mảng và một vô hướ ng và lấp đầy destination mặt nạ mảng: dst (I) = src(I) op vô hướ ng nơ i op là =,>, >=, <=, ho ặc !=. dst (I) đượ c thiết lập để 0xff (tất cả 1-bit) nếu mối quan hệ cụ thể giữa các yếu tố là đúng và 0 khác. Tất cả các mảng phải có cùng kích thướ c (hoặc kích thướ c ROI). cvConvertScale Chuyển đổi một mảng khác vớ i tùy chọn chuyển đổi tuyến tính. void cvConvertScale(const CvArr* src, CvArr* dst, double scale=1, double shift=0); #define cvCvtScale cvConvertScale #define cvScale cvConvertScale #define cvConvert(src, dst ) cvConvertScale((src), (dst), 1, 0 ) 33
src Nguồn mảng dst Điểm đến mảng scale quy mô Quy mô shift thay đổi giá trị gia tăng cho các yếu tố nguồn mảng quy mô Hàm có một số mục đích khác nhau, và do đó có nhiều tên khác nhau. Nó sao chép m ột mảng khác vớ i tùy chọn mở rộng quy mô, đó là thực hiện đầu tiên và / hoặc chuyển đổi loại hình tùy chọn, thực hiện sau: dst(I) = scalesrc(I) + (shift0, shift1,…) Tất cả các kênh của các mảng đa kênh đượ c xử lý độc lập. Loại chuyển đổi đượ c thực hiện làm tròn số và độ bão hòa, đó là nếu kết quả của mở rộng quy mô + chuyển đổi có thể không đượ c đại di ện chính xác bở i một giá trị của lo ại ph ần tử mảng đích, đó là thiết lập để các giá tr ị biểu diễn gần nhất trên trục thực. Trong trườ ng hợ p có scale=1, shift=0 prescaling không đượ c thực hiện. Đây là một trườ ng hợ p đặc biệt tối ưu và nó đã cvConvert tên thích h ợ p . Nếu nguồn và đích các lo ại mảng có bằng nhau loại, điều này cũng là một trườ ng hợ p đặc biệt có thể đượ c sử dụng để quy mô và thay đổi một ma trận hay một hình ảnh và đượ c caled cvScale. cvConvertScaleAbs Chuyển đổi các ph ần t ử mảng đầu vào một s ố nguyên unsigned 8-bit vớ i tùy chọn chuyển đổi tuyến tính. void cvConvertScaleAbs(const CvArr* src, CvArr* dst, double scale=1, double shift=0); src Nguồn mảng dst Điểm đến mảng dst (nên có chiều sâu 8u) quy mô ScaleAbs yếu tố thay đổi giá trị gia tăng cho các yếu tố nguồn mảng quy mô Hàm này tươ ng tự như cvConvertScale , nhưng nó lưu trữ giá trị tuyệt đối của chuyển đổi kết quả: dst (I) = | scalesrc (I) + (shift0, shift1, ...)| Hàm hỗ trợ các điểm đến mảng chỉ của 8u (8-bit số nguyên không dấu) loại, cho các loại Hàm có thể đượ c mô phỏng bở i một sự kết hợ p của các Hàm cvConvertScale và cvAbs . cvCvtScaleAbs Chuyển đổi các ph ần t ử mảng đầu vào một s ố nguyên unsigned 8-bit vớ i tùy chọn chuyển đổi tuyến tính. void cvCvtScaleAbs(const CvArr* src, CvArr* dst, double scale=1, double shift=0); src Nguồn mảng dst Điểm đến mảng (nên có chiều sâu 8u) scale quy mô ScaleAbs yếu tố shift thay đổi giá trị gia tăng cho các yếu tố nguồn mảng quy mô Hàm này tươ ng t ự như cvConvertScale , nhưng nó lưu tr ữ giá trị tuyệt đối c ủa chuyển đổi k ết quả: dst (I) = | scalesrc (I) + (shift0, shift1, ...)| Hàm hỗ trợ các điểm đến mảng chỉ của 8u (8-bit số nguyên không dấu) loại, cho các loại Hàm có thể đượ c mô phỏng bở i một sự kết hợ p của các Hàm cvConvertScale và cvAbs . 34
cvCopy Bản sao một mảng khác. void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL); src Các mảng nguồn dst Các mảng đích mask mặt nạ hoạt động, 8-bit kênh mảng; quy định cụ thể các yếu t ố của mảng đích đượ c thay đổi Hàm sao chép các yếu tố đượ c lựa chọn từ một mảng đầu vào một mảng đầu ra: dst(I) = src(I) if mask(I) = 0: Nếu bất kỳ của các mảng thông qua IplImage loại, sau đó thu nhập từ đầu của nó và các l ĩ nh vực COI đượ c s ử dụng. Cả hai mảng phải có cùng loại, cùng kích thướ c, và kích th ướ c gi ống nhau. Các Hàm cũng có thể sao chép các mảng thưa thớ t (mặt nạ không đượ c hỗ trợ trong trườ ng hợ p này). cvCountNonZero Số lượ ng các yếu tố mảng khác không. int cvCountNonZero(const CvArr* arr); arr mảng phải là một kênh duy nhất mảng hoặc một hình ảnh đa kênh vớ i COI thiết lập Hàm trả về số lượ ng các yếu tố khác không trong arr:
( arr( ≠ 0)
Trong trườ ng hợ p của IplImage c ả hai ROI và COI đượ c hỗ trợ . cvCreateData Phân bổ mảng dữ liệu void cvCreateData(CvArr* arr); arr mảng tiêu đề Hàm phân bổ hình ảnh, ma trận hoặc m ảng dữ liệu đa chiều. L ưu ý rằng trong trườ ng hợ p các loại ma trận Hàm OpenCV phân bổ đượ c s ử dụng và trong trườ ng hợ p c ủa IplImage họ đượ c sử dụng trừ khi CV_TURN_ON_IPL_COMPATIBILITY đượ c gọi là. Trong tr ườ ng hợ p thứ hai, Hàm IPL đượ c sử dụng để phân bổ dữ liệu. cvCreateImage Tạo một tiêu đề hình ảnh và phân bổ các dữ liệu hình ảnh. IplImage* cvCreateImage(CvSize size, int depth, int channels); size Hình ảnh kích thướ c chiều rộng và chiều cao depth Bit độ sâu của các yếu tố hình ảnh. Xem IplImage cho độ sâu hợ p lệ. channels số kênh của các kênh cho mỗi điểm ảnh. Xem IplImage để biết thêm chi ti ết. Hàm này chỉ tạo ra hình ảnh vớ i các kênh xen k ẽ. Cuộc gọi này là một hình thức rút gọn của header = cvCreateImageHeader(size, depth, channels); cvCreateData(header); 35
cvCreateImageHeader Tạo một tiêu đề hình ảnh nhưng không phân bổ dữ liệu hình ảnh. IplImage* cvCreateImageHeader(CvSize size, int depth, int channels); size kích thướ c chiều rộng và chiều cao depth Hình ảnh chiều sâu chiều sâu (xem cvCreateImage) channels Số lượ ng các kênh của các kênh (xem cvCreateImage) Cuộc gọi này là một chất tươ ng tự hdr=iplCreateImageHeader(channels, 0, depth, channels == 1 ? "GRAY" : "RGB", channels == 1 ? "GRAY" : channels == 3 ? "BGR" : channels == 4 ? "BGRA" : "", IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_TL, 4, size.width, size.height, 0,0,0,0); nhưng nó không sử dụng các Hàm IPL theo mặc định (xem CV_TURN_ON_IPL_COMPATIBILITY). cvCreateMat Tạo ra một tiêu đề ma trận và phân bổ dữ liệu ma trận. CvMat* cvCreateMat(int rows,int cols,int type); rows Số lượ ng hàng trong ma trận cols Số lượ ng cột trong ma trận type Các loại ma trận các yếu tố trong hình thức CV_
C , trong đó S = ký kết, U = unsigned, F = float. Ví d ụ, CV 8UC1 có ngh ĩ a là các yếu t ố đượ c 8bit unsigned và có 1 kênh, và CV 32SC2 có ngh ĩ a là các yếu tố 32-bit đã ký và có 2 kênh. Đây là hình thức ngắn gọn: CvMat* mat = cvCreateMatHeader(rows, cols, type); cvCreateData(mat); cvCreateMatHeader Tạo một tiêu đề ma trận, nhưng không phân bổ dữ liệu ma trận. CvMat* cvCreateMatHeader(int rows,int cols,int type); rows Số lượ ng hàng trong ma trận cols Số lượ ng cột trong ma trận type Loại các yếu tố ma trận, xem cvCreateMat Hàm phân bổ một tiêu đề ma trận mớ i và trả về một con trỏ đến nó. Các dữ liệu ma trận có thể sau đó đượ c phân bổ sử dụng cvCreateData ho ặc thiết l ập một cách rõ ràng để ngườ i s ử dụng dữ liệu thông qua giao cvSetData. cvCreateMatND Tạo tiêu đề và phân bổ dữ liệu cho một mảng đa chiều dày đặc. CvMatND* cvCreateMatND(int dims,const int* sizes,int type); dims số kích thướ c mảng. Điều này không đượ c v ượ t quá CV_MAX_DIM (32 theo mặc định, nhưng có thể đượ c thay đổi thờ i gian xây dựng). sizes mảng có kích thướ c kích thướ c. type Loại phần tử mảng, xem cvCreateMat. 36
Đây là một hình thức viết tắt của: CvMatND* mat = cvCreateMatNDHeader(dims, sizes, type); cvCreateData(mat);
cvCreateMatNDHeader Tạo một tiêu đề ma trận mớ i nhưng không phân bổ dữ liệu ma trận. CvMatND* cvCreateMatNDHeader(int dims, const int* sizes, int type); dims Number of array dimensions kích thướ c mảng có kích thướ c kích thướ c Loại kiểu của các phần tử mảng, xem cvCreateMat Hàm phân bổ một tiêu đề cho một mảng đa chiều dày đặc. Các mảng dữ liệu có thể tiếp tục đượ c phân bổ bằng cách sử dụng cvCreateData ho ặc thiết lập một cách rõ ràng để ngườ i sử dụng dữ liệu thông qua giao cvSetData. cvCreateSparseMat Tạo mảng thưa thớ t. CvSparseMat* cvCreateSparseMat(int dims, const int* sizes, int type); dims số kích thướ c mảng. Ngượ c lại vớ i ma trận dày đặc, s ố lượ ng kích thướ c thực t ế không giớ i hạn (lên đến 216). sizes kích thướ c mảng có kích thướ c kích thướ c type Loại phần tử mảng. Giống như cho CvMat Hàm phân bổ một mảng đa chiều thưa thớ t. Ban đầu, các mảng không có tính, cvGet hoặc cvGetReal trả về zero cho mỗi chỉ số. cvCrossProduct Tính sản phẩm chéo của hai vect ơ 3D. void cvCrossProduct(const CvArr* src1, const CvArr* src2, CvArr* dst); src1 Các vector ngu ồn đầu tiên src2 Các vector ngu ồn thứ hai dst Các vector đích Hàm tính toán sản phẩm chéo của hai vect ơ 3D: dst = src1 x src2 hoặc: dst1 = src12src23 - src13src22 dst2 = src13src21 - src11src23 dst3 = src11src22 - src12src21 CvtPixToPlane Đồng ngh ĩ a cho chia . cvDCT Thực hiện một về phía trướ c hoặc ngượ c rờ i rạc cô sin chuyển đổi của một mảng floating-point 1D hoặc 2D. void cvDCT(const CvArr* src, CvArr* dst, int flags); src Nguồn mảng, bất mảng 1D hoặc 2D dst Điểm đến mảng có cùng kích thướ c và cùng một loại như là nguồn gốc cờ chuyển đổi cờ , một sự kết hợ p của các giá trị sau 37
CV_DXT_FORWARD một biến đổi tiến 1D hoặc 2D. CV_DXT_ngượ c một 1D ngượ c hoặc chuyển đổi 2D. CV_DXT_ROWS làm một biến đổi về phía trướ c hoặc ngượ c của tất cả các hàng cá nhân c ủa ma trận đầu vào. Lá cờ này cho phép ngườ i dùng chuyển đổi các vector nhi ều cùng một lúc và có thể đượ c sử dụng để giảm các chi phí (mà đôi khi lớ n hơ n gấp nhiều lần so vớ i chế biến chính nó), để làm biến đổi 3D và chiều cao hơ n và vv. Hàm thực hiện một biến đổi về phía trướ c hoặc nghịch đảo của một 1D hoặc mảng 2D nổi điểm: Chuyển tiếp cô sin biến đổi của vector 1D của các yếu tố N: Y = C(N) . X nơ i
Và = 1, = 2 vớ > 0 Inverse cosin biến đổi của vector 1D của các yếu tố N: (C(N) là ma trận trực giao, C(N) . C(N)T = I) Chuyển tiếp cô sin biến đổi 2D M x N ma trận:
Inverse cô sin biến đổi của vector 2D của các yếu tố M x N:
cvDFT Thực hiện một Fourier rờ i rạc về phía trướ c hoặc ng ượ c biến đổi c ủa một mảng nổi điểm 1D hoặc 2D. void cvDFT(const CvArr* src, CvArr* dst, int flags, int nonzeroRows=0); src Source mảng, thực hay phức tạp dst Điểm đến mảng có cùng kích thướ c và cùng một loại như là nguồn gốc flags chuyển đổi cờ , một sự kết hợ p của các giá tr ị sau : CV_DXT_FORWARD một biến đổi tiến 1D hoặc 2D. Kết quả là không thu nhỏ lại. CV_DXT_INVERSE một 1D ngượ c hoặc chuyển đổi 2D. Kết quả là không thu nhỏ lại. CV_DXT_FORWARD và CV_DXT_INVERSE nghịch đảo là loại trừ lẫn nhau, tất nhiên. CV_DXT_SCALE quy mô kết quả: chia nó cho s ố lượ ng các phần tử mảng. Thông thườ ng, đó là kết hợ p vớ i CV_DXT_INVERSE, và ngườ i ta có thể sử dụng một phím tắt CV_DXT_INV_SCALE. CV_DXT_ROWS làm một biến đổi về phía trướ c hoặc ngượ c của tất cả các hàng cá nhân của ma trận đầu vào. Cờ này cho phép ngườ i sử dụng để chuyển đổi vector nhiều cùng một lúc và có thể đượ c s ử dụng để giảm chi phí (mà đôi khi lớ n h ơ n g ấp nhiều l ần so vớ i ch ế biến chính nó), để làm biến đổi 3D và chiều cao hơ n và vv. CV_DXT_INVERSE_SCALE giống như CV_DXT_INVERSE + CV_DXT_SCALE 38
nonzeroRows Số hàng khác không trong mảng nguồn (trong trườ ng hợ p của một tiến 2d xuyên hình thức), hoặc một số hàng quan tâm trong mảng điểm đến (trong trườ ng hợ p của một 2d ngượ c biến đổi). Nếu giá trị là tiêu cực, bằng không, hoặc l ớ n h ơ n t ổng số của hàng. Tham số có thể đượ c sử dụng để tăng tốc độ chập 2d / t ươ ng quan khi tính toán thông qua DFT. Xem ví dụ dướ i đây. Hàm thực hiện một biến đổi về phía trướ c hoặc nghịch đảo của một 1D hoặc mảng 2D nổi điểm: Chuyển tiếp biến đổi Fourier của vector 1D của các yếu tố N:
Inverse biến đổi Fourier của vector 1D của các yếu tố N: Chuyển tiếp biến đổi Fourier của vector 2D của các yếu tố M x N: Y = F(M) . X . F(N) Inverse Fourier biến đổi của vector 2D của các yếu tố M x N: Trong trườ ng hợ p các dữ liệu thực sự (một kênh), định dạng đóng gói, đượ c vay mượ n từ IPL, đượ c sử dụng để đại diện các kết quả của một biến đổi Fourier về phía trướ c hoặc đầu vào cho một biến đổi Fourier ngượ c:
Lưu ý: cột cuối cùng là n ếu N là thậm chí, hàng cuối cùng là nếu M thậm chí còn. Trong trườ ng hợ p của 1D thực sự chuyển đổi kết quả trông giống như dòng đầu tiên của ma trận trên. Dướ i đây là ví dụ về làm thế nào để tính toán 2D chập sử dụng DFT. CvMat* A = cvCreateMat(M1, N1, CVg32F); CvMat* B = cvCreateMat(M2, N2, A->type); // it is also possible to have only abs(M2-M1)+1 times abs(N2-N1)+1 // part of the full convolution result CvMat* conv = cvCreateMat(A->rows + B->rows - 1, A->cols + B->cols - 1, A->type); // initialize A and B ... int dftgM = cvGetOptimalDFTSize(A->rows + B->rows - 1); int dftgN = cvGetOptimalDFTSize(A->cols + B->cols - 1); CvMat* dftgA = cvCreateMat(dft\_M, dft\_N, A->type); CvMat* dftgB = cvCreateMat(dft\_M, dft\_N, B->type); CvMat tmp; // copy A to dftgA and pad dft\_A with zeros 39
cvGetSubRect(dftgA, &tmp, cvRect(0,0,A->cols,A->rows)); cvCopy(A, &tmp); cvGetSubRect(dftgA, &tmp, cvRect(A->cols,0,dft\_A->cols - A->cols,A->rows)); cvZero(&tmp); // no need to pad bottom part of dftgA with zeros because of // use nonzerogrows parameter in cvDFT() call below cvDFT(dftgA, dft\_A, CV\_DXT\_FORWARD, A->rows); // repeat the same with the second array cvGetSubRect(dftgB, &tmp, cvRect(0,0,B->cols,B->rows)); cvCopy(B, &tmp); cvGetSubRect(dftgB, &tmp, cvRect(B->cols,0,dft\_B->cols - B->cols,B->rows)); cvZero(&tmp); // no need to pad bottom part of dftgB with zeros because of // use nonzerogrows parameter in cvDFT() call below cvDFT(dftgB, dft\_B, CV\_DXT\_FORWARD, B->rows); cvMulSpectrums(dftgA, dft\_B, dft\_A, 0 /* or CV\_DXT\_MUL\_CONJ to get correlation rather than convolution */); cvDFT(dftgA, dft\_A, CV\_DXT\_INV\_SCALE, conv->rows); // calculate only // the top part cvGetSubRect(dftgA, &tmp, cvRect(0,0,conv->cols,conv->rows)); cvCopy(&tmp, conv); cvDecRefData Decrements một mảng tham chiếu dữ liệu truy cập. void cvDecRefData(CvArr* arr); arr con trỏ đến một mảng tiêu đề Decrements Hàm truy cập dữ liệu tham chiếu trong một CvMat hoặc CvMatND nếu các tài liệu tham khảo con trỏ truy cập không phải là NULL. Nếu truy cập đạt đến s ố không, dữ liệu đượ c deallocated. Trong hi ện tại truy cập thực hiện các tài li ệu tham khảo không phải là NULL chỉ khi dữ liệu đã đượ c phân bổ bằng cách sử dụng các cvCreateData Hàm. Truy c ập s ẽ đượ c NULL trong các trườ ng hợ p khác như: dữ liệu bên ngoài đã đượ c giao cho tiêu đề bằng cách sử dụng cvSetData, các tiêu đề ma trận là một ph ần của một ma trận l ớ n hơ n ho ặc hình ảnh , hoặc tiêu đề đượ c chuyển đổi từ một hình ảnh hoặc tiêu đề ma trận n-chiều. cvDet Trả về yếu tố quyết định của một ma trận. double cvDet(const CvArr* mat); mat Các ma tr ận nguồn Hàm trả về yếu tố quyết định của mat ma tr ận vuông. Các phươ ng pháp trực tiếp đượ c sử dụng cho ma trận nhỏ và loại bỏ Gaussian đượ c sử dụng cho ma trận lớ n hơ n. Đối vớ i đối xứng tích cực xác định các ma tr ận, nó cũng có thể chạy cvSVD vớ i U = V = 0 và sau đó tính toán yếu tố quyết định là một sản phẩm của các yếu tố đườ ng chéo của W. cvDiv Performs per-element division of two arrays. void cvDiv(const CvArr* src1, 40
const CvArr* src2, CvArr* dst, double scale=1); src1 Các mảng nguồn đầu tiên. Nếu con trỏ NULL, mảng là giả định là tất cả 1. src2 Các mảng nguồn thứ hai dst Các mảng đích scale tùy chọn quy mô yếu tố Hàm phân chia một mảng khác: Tất cả các mảng phải có cùng loại và kích thướ c tươ ng tự (hoặc kích thướ c ROI). cvDotProduct Tính toán dấu chấm sản phẩm của hai mảng số liệu Ơclít. double cvDotProduct(const CvArr* src1, const CvArr* src2); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai Hàm tính toán và tr ả về sản phẩm dot Euclide c ủa hai mảng. src1 .src2 =
src1(I) .src2(I)
Trong trườ ng hợ p của nhiều mảng kênh, các k ết quả cho tất cả các kênh đượ c tích lũy. Cụ thể, cvDotProduct(a,a) là m ột vector phức t ạp, s ẽ trả về ||a||2. Hàm có thể quá trình đa chiều mảng, hàng của hàng, lớ p, từng lớ p, và như vậy. cvEigenVV Tính giá trị riêng và eigenvectors c ủa một ma trận đối xứng. void cvEigenVV(CvArr* mat, CvArr* evects, CvArr* evals, double eps=0, int lowindex = -1, int highindex = -1); mat đầu vào đối xứng vuông ma trận, sửa đổi trong quá trình chế biến evects ma trận đầu ra của eigenvectors, đượ c lưu trữ như các dòng tiếp theo evals vector đầu ra của giá trị riêng, đượ c lưu trữ theo thứ tự giảm dần (thứ tự của giá trị riêng và eigenvectors syncronized, t ất nhiên) eps chính xác diagonalization. Thông th ườ ng, DBL_EPSILON (khoảng 10^-15) hoạt động tốt. THÔNG SỐ NÀY HIỆN LÀ BỎ QUA. lowindex tùy chọn chỉ số lớ n nhất eigenvalue /-vector để tính toán . (Xem d ướ i đây.) highindex Tùy chọn chỉ số nhỏ nhất-giá trị riêng /-vector để tính toán . (Xem dướ i đây.) Hàm tính toán các giá tr ị riêng và eigenvectors c ủa ma trận A: mat*evects(i,:)’ = evals(i)*evects(i,:)’ (trong MATLAB ký hi ệu) Nếu hoặc thấp hoặc highindex đượ c cung cấp khác là cần thiết, quá. Lập chỉ mục là 0-dựa. Ví dụ: Để tính toán l ớ n nhất eigenvector / giá tr ị thiết lập lowindex = highindex = 0. Để tính toán tất cả các giá trị riêng, để lại lowindex = highindex =- 1. Đối vớ i các lý do di s ản Hàm này luôn luôn trả về một ma trận vuông kích th ướ c tươ ng tự như ma trận nguồn eigenvectors và 41
vector một chiều dài của ma trận nguồn vớ i giá trị riêng. Các eigenvectors ch ọn / giá trị luôn là ngườ i đầu tiên highindex - lowindex + 1 hàng. Nội dung của ma trận A là bị phá hủy bở i Hàm. Hiện nay Hàm là chậm hơ n so vớ i cvSVD chính xác nhưng ít hơ n, vì vậy nếu A đượ c biết đến là tích cực định ngh ĩ a (ví dụ, đó là một ma trận hi ệp ph ươ ng sai), nên sử dụng cvSVD để tìm giá trị riêng và eigenvectors A, đặc biệt là nếu eigenvectors là không cần thiết. cvExp Tính số mũ của mỗi phần tử mảng. void cvExp(const CvArr* src, CvArr* dst); src Các mảng nguồn dst Mảng đích, nó cần phải có loại tăng gấp đôi hoặc loại tươ ng tự như nguồn Hàm tính toán số mũ của tất cả các yếu tố của mảng đầu vào: dst[I] = esrc(I) Các lỗi t ươ ng đối t ối đa là khoảng 7.10-6. Hiện nay, Hàm chuyển đổi denormalized giá tr ị cho số không về sản lượ ng. cvFastArctan Tính các góc độ của một vector 2D. float cvFastArctan (float y, float x); x x-phối hợ p của 2D vector y y-phối hợ p của 2D vector Hàm tính toán góc đầy đủ tầm của một vector đầu vào 2D. Góc đượ c đo bằng độ và thay đổi từ 0 độ đến 360 độ. Chính xác là khoảng 0,1 độ. cvFlip Lật một mảng 2D xung quanh trục thẳng đứng, ngang hoặc cả hai. void cvFlip(const CvArr* src, CvArr* dst=NULL, int flipMode=0); src Nguồn mảng dst Điểm đến mảng. Nếu dst = NULL lật đượ c thực hiện tại chỗ. flipMode Chỉ định làm thế nào để lật các mảng: 0 có ngh ĩ a là flipping xung quanh tr ục x, tích cực (ví dụ, 1 ) có ngh ĩ a là flipping xung quanh tr ục y, tiêu cực (ví dụ, -1) có ngh ĩ a là lật xung quanh cả hai trục. Xem cũng thảo luận dướ i đây để các công thức: Hàm bật các mảng trong một trong ba cách khác nhau (chỉ số hàng và cột là 0-):
Các kịch bản ví dụ về sử dụng Hàm là: Lật theo chiều dọc của hình ảnh (flipMode = 0) để chuyển đổi giữa các hình ảnh trên cùng bên trái và phía d ướ i bên trái nguồn g ốc, mà là một ho ạt động điển hình trong x ử lý video theo các h ệ thống Win32. Lật ngang của hình ảnh vớ i sự thay đổi ngang tiếp theo và sự khác biệt tuyệt đối? Calculation để kiểm tra một đối xứng trục thẳng đứng (flipMode > 0) •
•
42
•
•
Đồng thờ i ngang, lật dọc của hình ảnh vớ i sự thay đổi tiếp theo và tuyệt đối tính toán để kiểm tra sự khác biệt cho một đối xứng trung tâm (flipMode <0) Đảo ngượ c thứ tự của các mảng điểm 1d (flipMode? 0)?
cvGEMM Thực hiện phép nhân ma trận tổng quát. void cvGEMM(const CvArr* src1, const CvArr* src2, double alpha, const CvArr* src3, double beta, CvArr* dst, int tABC=0); #define cvMatMulAdd(src1, src2, src3, dst ) cvGEMM(src1, src2, 1, src3, 1, dst, 0 ) #define cvMatMul(src1, src2, dst ) cvMatMulAdd(src1, src2, 0, dst ) src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai src3 mảng nguồn thứ ba (thay đổi). Có thể đượ c NULL, nếu có sự thay đổi. dst Các mảng đích tABC cờ hoạt động có thể là 0 hoặc sự kết hợ p của các giá trị sau CV_GEMM_AT chuyển src1 CV_GEMM_BT chuyển src2 CV_GEMM_CT chuyển src3 Ví dụ, CV_GEMM_AT + CV_GEMM_CT tươ ng ứng alpha src1T src2 + beta src3T Hàm thực hiện phép nhân ma trận tổng quát: dst = alpha op(src1) op(src2) + beta op(src3) where op(X) is X or X T Tất cả các ma tr ận cần phải có cùng một kiểu dữ liệu và kích cỡ phối hợ p. Real hoặc phức tạp ma trận nổi-điểm đượ c hỗ trợ . cvGet1D Trả lại một phần tử mảng cụ thể. CvScalar cvGet1D(const CvArr* arr, int idx0); CvScalar cvGet2D(const CvArr* arr, int idx0, int idx1); CvScalar cvGet3D(const CvArr* arr, int idx0, int idx1, int idx2); CvScalar cvGetND(const CvArr* arr, int* idx); arr đầu vào mảng idx0 số không dựa trên thành phần của chỉ số yếu tố đầu tiên idx1 số không dựa trên thành phần của chỉ số yếu tố idx2 số không dựa trên thứ ba thành phần của chỉ số yếu tố idx mảng của các chỉ số thành phần Các Hàm trả lại một phần tử mảng cụ thể. Trong trườ ng hợ p của một mảng thưa thớ t Hàm quay trở lại 0 nếu nút đượ c yêu cầu không tồn tại (không có nút mớ i đượ c tạo ra bở i các Hàm). cvGetCol (s) Trả về mảng cột hoặc khoảng cột. 43
CvMat* cvGetCol(const CvArr* arr, CvMat* submat, int col); CvMat* cvGetCols(const CvArr* arr, CvMat* submat, int startCol, int endCol); arr đầu vào mảng submat Con trỏ trỏ tớ i các tiêu đề phụ mảng kết quả col Zero-dựa trên chỉ số của cột đượ c lựa chọn startCol Zero-dựa trên chỉ số của cột bắt đầu (bao gồm) của nhịp endCol Zero-dựa trên chỉ số của cột kết thúc (độc quyền) của nhịp GetCol Hàm và GetCols trở lại tiêu đề, tươ ng ứng vớ i một cột cụ thể khoảng mảng đầu vào. GetCol là một phím tắt cho cvGetCols: cvGetCol(arr, submat, col); // ˜ cvGetCols(arr, submat, col, col + 1); cvGetDiag Trả lại một đườ ng chéo mảng. CvMat* cvGetDiag(const CvArr* arr, CvMat* submat, int diag=0); arr đầu vào mảng submat Con trỏ trỏ tớ i các tiêu đề phụ mảng kết quả chẩn mảng đườ ng chéo. Không tươ ng ứng vớ i đườ ng chéo chính, tươ ng ứng vớ i -1 đườ ng chéo ở trên, tươ ng ứng vớ i chính 1 đườ ng chéo dướ i chính, và vv. Hàm trả về tiêu đề, tươ ng ứng vớ i một đườ ng chéo quy định của mảng đầu vào. cvGetDims, cvGetDimSize Quay trở lại số kích thướ c mảng và kích thướ c của chúng, hoặc kích thướ c của một kích thướ c cụ thể. int cvGetDims(const CvArr* arr, int* sizes=NULL); int cvGetDimSize(const CvArr* arr, int index); arr mảng đầu vào sizes kích thướ c tùy chọn đầu ra của các kích th ướ c kích thướ c mảng. Đối vớ i mảng 2d số hàng (Chiều cao) đi số, đầu tiên của cột (chiều rộng). index chỉ số dựa trên kích th ướ c Zero-(cho ma tr ận 0 có ngh ĩ a là số lượ ng hàng, 1 có ngh ĩ a là số lượ ng cột, cho hình ảnh 0 có ngh ĩ a là chiều cao, 1 có ngh ĩ a là chiều rộng) Hàm CvGetDims trả về mảng và một mảng có kích thướ c kích thướ c chiều. Trong trườ ng hợ p của IplImage hoặc CvMat nó luôn luôn trả về 2 b ất k ể số lượ ng hình ảnh / ma trận hàng. CvGetDimSize Hàm trả về kích thướ c kích thướ c c ụ thể (số lượ ng c ủa các yếu tố mỗi r ằng kích thướ c). Ví dụ, các mã sau đây tính toán tổng số của các phần t ử mảng trong hai cách: // Thông qua cvGetDims () int sizes[CV_MAX_DIM]; int i, total = 1; int dims = cvGetDims(arr, size); for(i = 0; i < dims; i++ ) total *= sizes[i]; // Thông qua cvGetDims () và cvGetDimSize () int i, total = 1; int dims = cvGetDims(arr); for(i = 0; i < dims; i++ ) 44
total *= cvGetDimsSize(arr, i); cvGetElemType Trả về loại phần tử mảng. int cvGetElemType(const CvArr* arr); arr đầu vào mảng Hàm này trả về kiểu của các phần tử mảng như mô tả trong cuộc thảo luận cvCreateMat : CV_8UC1 ... CV_64FC4. cvGetImage Trả về tiêu đề hình ảnh cho mảng tùy ý. IplImage* cvGetImage(const CvArr* arr, IplImage* imageHeader); arr đầu vào mảng imageHeader Pointer IplImage c ấu trúc đượ c sử dụng như một bộ đệm tạm thờ i Hàm trả về tiêu đề hình ảnh cho các mảng đầu vào có thể là một ma trận CvMat , hoặc một hình ảnh - IplImage *. Trong tr ườ ng hợ p của một hình ảnh Hàm chỉ đơ n giản là trả về con trỏ đầu vào. Trong trườ ng hợ p của CvMat nó khở i tạo một cấu trúc imageHeader v ớ i các thông số của ma trận đầu và. Lưu ý rằng nếu chúng ta biến đổi IplImage CvMat và sau đó biến đổi CvMat trở lại IplImage, chúng tôi có th ể nhận đượ c tiêu đề khác nhau, nếu ROI đượ c thiết lập, và do đó m ột s ố Hàm IPL tính stride hình ảnh t ừ chiều r ộng c ủa nó và sắp x ếp có thể thất b ại trên các hình ảnh kết quả. cvGetImageCOI Trả về chỉ số của kênh quan tâm. int cvGetImageCOI(const IplImage* image); image con trỏ đến các tiêu đề hình ảnh Trả về kênh quan tâm của một trong IplImage. Giá tr ị trả về tươ ng ứng vớ i coi trong cvSetImageCOI. cvGetImageROI Trả về ROI hình ảnh. CvRect cvGetImageROI(const IplImage* image); image con trỏ đến các tiêu đề hình ảnh Nếu có không có thiết lập ROI, cvRect(0, 0, image->width, image->height) đượ c trả về. cvGetMat Trả về tiêu đề ma trận cho mảng tùy ý. CvMat* cvGetMat(const CvArr* arr, CvMat* header, int* coi=NULL, int allowND=0); arr đầu vào mảng tiêu đề Pointer CvMat cấu trúc đượ c sử dụng như một bộ đệm tạm thờ i coi tùy chọn đầu ra tham số cho lưu trữ COI allowND Nếu không phải s ố không, Hàm chấp nh ận đa chiều mảng dày đặc (CvMatND *) và tái quay 2D (nếu CvMatND có hai chiều) hoặc ma trận 1D (khi CvMatND có 1 kích th ướ c hoặc nhiều hơ n 2 chiều). Các mảng phải đượ c liên tục. Hàm trả về một ma trận tiêu đề cho các mảng đầu vào có thể là một ma trận - CvMat , một hình ảnh - IplImage ho ặc một mảng đa chiều dày đặc - CvMatND (sau trườ ng hợ p cho phép 45
chỉ khi allowND = 0). Trong trườ ng hợ p của ma trận Hàm chỉ đơ n giản là trả về con trỏ đầu vào. Trong trườ ng hợ p của IplImage * hoặc CvMatND nó khở i tạo các cấu trúc tiêu đề vớ i các thông số của ROI hình ảnh hiện tại và trả về con trỏ đến cấu trúc tạm thờ i. Bở i vì COI là không đượ c hỗ trợ bở i CvMat , nó đượ c trả lại một cách riêng bi ệt. Hàm này cung cấp một cách dễ dàng để xử lý cả hai loại của các mảng - IplImage và CvMat Bằng cách sử dụng cùng một mã. Ngượ c l ại bi ến đổi t ừ CvMat để IplImage có thể đượ c th ực hiện bằng cách sử dụng cvGetImage. Đầu vào mảng phải có dữ liệu cơ bản đượ c phân bổ hoặc đính kèm, nếu không Hàm không thành công. Nếu các mảng đầu vào là IplImage vớ i cách bố trí dữ liệu phẳng và thiết l ập COI, Hàm trả về con trỏ để chọn máy bay và COI = 0. Nó cho phép mỗi máy bay x ử lý hình ảnh đa kênh vớ i cách bố trí dữ liệu phẳng bằng cách sử dụng Hàm OpenCV. cvGetNextSparseNode Trả về các yếu tố ma trận thưa thớ t tiếp theo CvSparseNode* cvGetNextSparseNode(CvSparseMatIterator* matIterator); matIterator thưa thớ t mảng iterator Hàm di chuyển iterator tớ i phần tử ma trận thưa thớ t tiếp theo và trả về con trỏ đến nó. Trong phiên bản hiện hành không có bất kỳ thứ tự cụ thể của các yếu t ố, bở i vì chúng đượ c lưu trữ trong bảng băm. Các mẫu dướ i đây giải thích làm thế nào để lặp qua ma tr ận thưa thớ t: Sử dụng cvInitSparseMatIterator và cvGetNextSparseNode để tính toán tổng của floating-point thưa thớ t mảng. double sum; int i, dims = cvGetDims(array); CvSparseMatIterator mat_iterator; CvSparseNode* node = cvInitSparseMatIterator(array, &mat_iterator); for(; node != 0; node = cvGetNextSparseNode(&mat_iterator )) { /* get pointer to the element indices */ int* idx = CV_NODE_IDX(array, node); /* get value of the element (assume that the type is CV_32FC1) */ float val = *(float*)CV_NODE_VAL(array, node); printf("("); for(i = 0; i < dims; i++ ) printf("%4d%s", idx[i], i < dims - 1 "," : "): "); printf("%g\n", val); sum += val; } printf("\nTotal sum = %g\n", sum);
cvGetOptimalDFTSize Trả về kích thướ c DFT tối ưu cho một kích thướ c vector nhất định. int cvGetOptimalDFTSize(int size0); size0 Vector kích th ướ c 46
Hàm trả về N số lượ ng tối thiểu lớ n hơ n hoặc bằng size0, như vậy mà DFT của một vector có kích thướ c N có thể đượ c tính toán nhanh. Trong vi ệc thực hiện hiện nay của N = 2p x 3q x 5r, đối vớ i một số p, q, r. Hàm trả về một số âm nếu size0 là quá lớ n (rất gần vớ i INT_MAX) cvGetRawData Lấy thông tin ở mức độ thấp về mảng. void cvGetRawData(const CvArr* arr, uchar** data, int* step=NULL, CvSize* roiSize=NULL); arr mảng tiêu đề data đầu ra con trỏ đến nguồn g ốc toàn bộ hình ảnh hoặc nguồn g ốc thu nhập t ừ đầu n ếu ROI đượ c thiết lập step đầu ra đầy đủ hàng chiều dài theo byte roiSize đầu ra ROI kích th ướ c Hàm đầy biến đầu ra vớ i mức độ thấp thông tin về các dữ liệu mảng. Tất cả các đầu ra các thông số là tùy chọn, vì vậy m ột số các con trỏ có thể đượ c thiết lập để NULL. Nếu mảng là IplImage vớ i thu nhập từ đầu thiết lập, các thông số của ROI đượ c trả về. Ví dụ sau đây cho thấy làm thế nào để có đượ c quyền truy cập vào các ph ần tử mảng. GetRawData tính toán giá trị tuyệt đối của các yếu tố trong một kênh duy nhất, điểm nổi mảng. float* data; int step; CvSize size; int x, y; cvGetRawData(array, (uchar**)&data, &step, &size); step /= sizeof(data[0]); for(y = 0; y < size.height; y++, data += step ) for(x = 0; x < size.width; x++ ) data[x] = (float)fabs(data[x]); cvGetReal*D Quay trở lại một yếu tố cụ thể của mảng kênh duy nhất. double cvGetReal1D(const CvArr* arr, int idx0); double cvGetReal2D(const CvArr* arr, int idx0, int idx1); double cvGetReal3D(const CvArr* arr, int idx0, int idx1, int idx2); double cvGetRealND(const CvArr* arr, int* idx); arr đầu vào mảng. Phải có một kênh duy nhất. idx0 số không dựa trên thành phần của chỉ số yếu tố đầu tiên idx1 số không dựa trên thành phần của chỉ số yếu tố idx2 số không dựa trên thứ ba thành phần của chỉ số yếu tố idx mảng của các chỉ số thành phần Các Hàm cvGetReal*D tr ả về một yếu tố cụ thể của một mảng một kênh. Nếu các mảng có nhiều kênh khác nhau, một lỗi th ờ i gian chạy đượ c nêu ra. Lưu ý r ằng cvGet Hàm có thể đượ c 47
sử dụng một cách an toàn cho c ả hai kênh duy nhất và nhiều kênh mảng m ặc dù chúng chậm hơ n một chút. Trong trườ ng hợ p của một mảng thưa thớ t Hàm trả về 0 nếu nút đượ c yêu cầu không tồn tại (không có nút mớ i đượ c tạo ra bở i các Hàm). cvGetRow(s) Trả về mảng hàng hoặc khoảng hàng. CvMat* cvGetRow(const CvArr* arr, CvMat* submat, int row); CvMat* cvGetRows(const CvArr* arr, CvMat* submat, int startRow, int endRow, int deltaRow=1); arr đầu vào mảng submat Con trỏ trỏ tớ i các tiêu đề phụ mảng kết quả row dựa trên ch ỉ số của Zero-hàng đã chọn startRow Zero-dựa trên chỉ số của hàng bắt đầu (bao gồm) của nhịp endRow Zero-dựa trên chỉ số của hàng kết thúc (độc quyền) của nhịp deltaRow Index bướ c trong khoảng thờ i gian hàng. Đó là, Hàm chiết xuất mỗi hàng thứ deltaRow startRow và đến (nhưng không bao gồm) endRow. Các hàm quay trở lại tiêu đề, t ươ ng ứng v ớ i m ột khoảng hàng / hàng quy định c ủa m ảng đầu vào. Lưu ý rằng GetRow là một phím tắt cho cvGetRows: cvGetRow(arr, submat, row ) ˜ cvGetRows(arr, submat, row, row + 1, 1); cvGetSize Trả về kích thướ c của ma trận hoặc hình ảnh ROI. CvSize cvGetSize(const CvArr* arr); arr mảng tiêu đề Hàm trả về số hàng (CvSize::height) và s ố cột CvSize::width) của ma trận đầu vào hoặc hình ảnh. Trong trườ ng hợ p của hình ảnh, kích thướ c của ROI đượ c trả về. cvGetSubRect Trả về tiêu đề ma trận tươ ng ứng vớ i các tiểu mảng của hình ảnh đầu vào hoặc ma trận hình chữ nhật. CvMat* cvGetSubRect(const CvArr* arr, CvMat* submat, CvRect rect); arr đầu vào mảng submat Con trỏ trỏ tớ i các tiêu đề phụ mảng kết quả rect Zero-tọa độ của hình chữ nhật quan tâm Hàm trả về tiêu đề, t ươ ng ứng v ớ i m ột hình chữ nhật quy định c ụ thể của mảng đầu vào. Nói cách khác từ, nó cho phép ngườ i sử dụng để điều trị một phần hình chữ nhật của mảng đầu vào như là một mảng độc lập. ROI là đưa vào tài kho ản theo Hàm, do đó các mảng của ROI thật sự rút ra. cvInRange Kiểm tra rằng các phần tử mảng nằm giữa các yếu tố của hai mảng khác. void cvInRange(const CvArr* src, const CvArr* lower, const CvArr* upper, CvArr* dst); 48
src Các mảng nguồn đầu tiên lower mảng ranh giớ i thấp hơ n, bao gồm upper ranh giớ i độc quyền trên mảng dst Mảng đích, phải có loại 8u hoặc 8s Hàm kiểm tra phạm vi cho mọi phần tử của mảng đầu vào: dst(I) = lower(I)0 <= src(I)0 < upper(I)0 Đối vớ i mảng kênh duy nhất, dst(I) = lower(I)0 <= src(I)0 < upper(I)0 ^ lower(I)1 <= src(I)1 < upper(I)1 Đối vớ i hai kênh mảng và v.v, dst (I) đượ c thiết l ập để 0xff (tất cả 1-bit) nếu src (I) trong phạm vi và 0 nếu ng ượ c lại. T ất c ả các mảng có cùng loại, trừ điểm đến, và kích thướ c tươ ng tự (hoặc thu nhập từ đầu kích thướ c). cvInRangeS Kiểm tra các phần tử mảng nằm giữa hai vô hướ ng. void cvInRangeS(const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst); src Các mảng nguồn đầu tiên lower Càng thấp bao gồm ranh giớ i upper Trên ranh gi ớ i vùng đặc quyền dst Các mảng đích, phải có loại 8u hoặc 8s Hàm kiểm tra phạm vi cho mọi phần tử của mảng đầu vào: dst(I) = lower0 <= src(I)0 < upper0 Đối vớ i mảng kênh duy nhất, dst(I) = lower0 <= src(I)0 < upper0 ^ lower1 <= src(I)1 < upper1 Đối vớ i hai kênh mảng thứ hai ..., ‘dst (I)’ đượ c thiết lập để 0xff (tất cả 1-bit) nếu 'src (I), trong phạm vi và 0 nếu ngượ c lại.Tất cả các mảng phải có cùng kích thướ c (hoặc kích thướ c ROI). cvIncRefData Increments mảng dữ liệu tham khảo truy cập. int cvIncRefData(CvArr* arr); arr mảng tiêu đề Hàm gia tăng CvMat hoặc CvMatND truy cập tài liệu tham khảo dữ liệu và trả về mớ i truy cập giá trị nếu con trỏ truy cập tài liệu tham khảo không phải là NULL, nếu không nó sẽ trả về số không. cvInitImageHeader Khở i tạo một tiêu đề hình ảnh đã đượ c giao tr ướ c đây. IplImage* cvInitImageHeader( IplImage* image, CvSize size, int depth, int channels, int origin=0, int align=4); image Hình ảnh tiêu đề để khở i tạo size Hình ảnh kích thướ c chiều rộng và chiều cao 49
depth Hình ảnh chiều sâu chiều sâu (xem cvCreateImage) channels Số lượ ng các kênh của các kênh (xem cvCreateImage) origin trên trái IPL_ORIGIN_TL ho ặc phía dướ i bên trái IPL_ORIGIN_TL align sắp xếp sắp cho các hàng hình ảnh, thườ ng là 4 hoặc 8 byte Trả lại IplImage* điểm tiêu đề khở i tạo. cvInitMatHeader Khở i tạo một tiêu đề ma trận đượ c cấp phát trướ c. CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type, void* data=NULL, int step=CV_AUTOSTEP); mat con trỏ đến các tiêu đề ma trận đượ c khở i tạo rows Số lượ ng hàng trong ma trận cols Số lượ ng cột trong ma trận type Loại các yếu tố ma trận, xem cvCreateMat. data tùy chọn: dữ liệu con trỏ đượ c gán cho tiêu đề ma trận step Tùy chọn: chiều r ộng hàng đầy đủ trong byte dữ liệu đượ c giao. Theo mặc định, tối thiểu có thể bướ c đượ c sử dụng giả định không có khoảng trống giữa các hàng ti ếp theo của ma trận. Hàm này thườ ng đượ c sử dụng để xử lý dữ liệu thô vớ i các Hàm ma tr ận OpenCV. Ví dụ, các mã sau đây tính sản phẩm ma trận của hai ma trận, đượ c lưu trữ như mảng bình thườ ng: double a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; double b[] = { 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12 }; double c[9]; CvMat Ma, Mb, Mc ; cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a); cvInitMatHeader(&Mb, 4, 3, CV_64FC1, b); cvInitMatHeader(&Mc, 3, 3, CV_64FC1, c); cvMatMulAdd(&Ma, &Mb, 0, &Mc); // Mảng c giờ chứa các sản phẩm của một (3x4) và b (4x3) cvInitMatNDHeader Khở i tạo một tiêu đề đa chiều mảng đượ c cấp phát trướ c. CvMatND* cvInitMatNDHeader( CvMatND* mat, int dims, const int* sizes, 50
int type, void* data=NULL); mat con trỏ đến mảng để tiêu đề đượ c khở i tạo dims số của kích thướ c mảng sizes một mảng có kích thướ c kích thướ c type kiểu của các phần tử mảng, xem cvCreateMat data tùy chọn dữ liệu con trỏ đượ c gán cho tiêu đề ma trận cvInitSparseMatIterator Khở i tạo mảng thưa thớ t yếu tố lặp. CvSparseNode* cvInitSparseMatIterator(const CvSparseMat* mat, CvSparseMatIterator* matIterator); mat đầu vào mảng matIterator khở i tạo Iterator Hàm khở i tạo biến lặp của các phần tử mảng thưa thớ t và trả về con trỏ đến các yếu tố đầu tiên, hoặc NULL nếu mảng có sản phẩm nào. cvInvSqrt Tính nghịch đảo vuông gốc. float cvInvSqrt(float value); value Giá trị đầu vào dấu chấm động Hàm tính toán g ốc nghịch đảo c ủa các đối s ố vuông, và thông thườ ng nó là nhanh hơ n 1./sqrt (giá trị). Nếu đối số là số không hoặc tiêu cực, kết quả là không xác định. Đặc biệt giá trị (± ∞) không đượ c xử lý. cvInv Đồng ngh ĩ a cho Invert cvInvert Tìm nghịch đảo hoặc giả nghịch đảo của một ma trận. double cvInvert(const CvArr* src, CvArr* dst, int method=CV LU); src Các ma trận nguồn dst Các ma trận điểm đến method Phươ ng pháp phươ ng pháp Inversion CV_LU Gaussian loại trừ có yếu tố trục tối ưu đượ c lựa chọn CV_SVD phươ ng pháp phân hủy giá trị từ (SVD) CV_SVD_SYM SVD phươ ng pháp cho một ma trận tích cực xác định đối xứng Hàm đảo ngượ c của ma trận src1 và lưu trữ kết quả trong src2. Trong các trườ ng hợ p phươ ng pháp LU, Hàm tr ả về các yếu tố quyết định src1 (src1 phải là hình vuông). Nếu nó là 0, ma tr ận là không đảo ngượ c và src2 đượ c làm đầy vớ i số không. Trong trườ ng hợ p các phươ ng pháp SVD, Hàm trả về tình trạng nghịch đảo của src1 (tỷ lệ của giá trị nhỏ nhất từ các giá trị lớ n nhất từ) và 0 nếu src1 là tất cả các số không. SVD phươ ng pháp tính toán ma tr ận giả nghịch đảo nếu src1 là số ít. cvIsInf Xác định nếu đối số là vô cực. int cvIsInf(double value); 51
value Giá trị đầu vào dấu chấm động Hàm trả về 1 nếu đối số là ±∞ (theo quy định của IEEE754 tiêu chu ẩn), 0 nếu ngượ c lại. cvIsNaN Xác định nếu đối số là không phải là một số. int cvIsNaN(double value); Giá trị đầu vào giá trị dấu chấm động Hàm trả về 1 nếu đối số là A Number (theo quy định của IEEE754 tiêu chu ẩn), 0 khác. cvLUT Thực hiện một cái nhìn lên bảng biến đổi của một mảng. void cvLUT(const CvArr* src, CvArr* dst, const CvArr* lut); src Nguồn loạt các yếu tố 8-bit dst Điểm đến mảng dst của một độ sâu nhất định và cùng một số kênh như các mảng nguồn lut Nhìn lên bảng là 256 yếu t ố, nên có độ sâu tươ ng tự như các mảng đích. Trong trườ ng hợ p của đa kênh nguồn và mảng đích, các bảng có cần phải có một đơ n kênh (trong trườ ng hợ p này cùng một bảng đượ c sử dụng cho tất cả các kênh) hoặc số lượ ng của các kênh như là nguồn gốc / mảng đích. Hàm lấp đầy các mảng điểm đến có giá tr ị từ bảng nhìn lên. Chỉ số của các mục đượ c l ấy từ mảng nguồn. Đó là, Hàm xử lý mỗi phần tử của src như sau: dsti ← lutsrci+d nơ i: d= | 0 nếu src có chiều sâu CV_8U | 128 nếu src có chiều sâu CV_8S cvLog Tính logarit tự nhiên của giá trị tuyệt đối tất cả các phần tử mảng. void cvLog(const CvArr* src, CvArr* dst); src Các mảng nguồn dst Mảng đích, nó cần phải có loại tăng gấp đôi hoặc loại tươ ng tự như nguồn Hàm tính toán logarit t ự nhiên của giá trị tuyệt đối của tất cả các yếu tố đầu vào mảng: Trườ ng hợ p C là một số tiêu cực lớ n (khoảng -700 trong việc thực hiện hiện tại). cvMahalonobis Tính khoảng cách Mahalonobis gi ữa hai vect ơ . double cvMahalanobis( const CvArr* vec1, const CvArr* vec2, CvArr* mat); vec1 1D nguồn đầu tiên vector vec2 Các nguồn 1D thứ hai vector mat ma trận hiệp phươ ng sai nghịch đảo Hàm tính toán và trả về khoảng cách trọng giữa hai vectơ : 52
Ma trận hiệp ph ươ ng sai có thể đượ c tính bằng cách sử dụng Hàm cvCalcCovarMatrix và h ơ n nữa đảo ngượ c bằng cách sử dụng các Hàm cvInvert (CV_SVD phươ ng pháp là một trong những ưu tiên bở i vì các ma trận có thể là số ít). cvMat Khở i tạo ma trận tiêu đề (biến thể nhẹ). CvMat cvMat( int rows, int cols, int type, void* data=NULL); rows Số lượ ng hàng trong ma trận cols Số lượ ng cột trong ma trận type loại của các yếu tố ma trận - xem cvCreateMat data tùy chọn dữ liệu con trỏ đượ c gán cho tiêu đề ma trận Khở i tạo một tiêu đề ma trận và gán dữ liệu cho nó. Ma trận là đầy hàng khôn ngoan (c ột đầu tiên các yếu tố của dữ liệu hàng đầu tiên của ma trận, v.v) Hàm này là một sự thay thế nội tuyến nhanh chóng cho cvInitMatHeader. C ụ thể, nó tươ ng đươ ng vớ i: CvMat mat; cvInitMatHeader(&mat, rows, cols, type, data, CV\_AUTOSTEP); cvMax Tìm tối đa mỗi phần tử của hai mảng. void cvMax(const CvArr* src1, const CvArr* src2, CvArr* dst); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai dst Các mảng đích Hàm tính toán t ối đa cho mỗi phần tử của hai mảng: dst(I) = max(src1(I); src2(I)) Tất cả các mảng phải có một kênh duy nhất, kiểu dữ liệu giống nhau và kích thướ c tươ ng tự (hoặc thu nhập từ đầu kích thướ c). cvMaxS Tìm thấy tối đa cho mỗi phần tử của mảng và vô hướ ng. void cvMaxS(const CvArr* src, double value, CvArr* dst); src Các mảng nguồn đầu tiên value giá trị vô hướ ng dst Các mảng đích Hàm tính toán t ối đa cho mỗi phần tử của mảng và vô hướ ng: dst (I) = max (src1(I), src2(I)) Tất cả các mảng phải có một kênh duy nhất, kiểu dữ liệu giống nhau và kích thướ c tươ ng tự (hoặc kích thướ c ROI). 53
cvMerge Sáng tác một m ảng đa kênh từ kênh duy nhất một s ố mảng hoặc chèn một kênh duy nhất vào mảng. void cvMerge(const CvArr* src0, const CvArr* src1, const CvArr* src2, const CvArr* src3, CvArr* dst); #define cvCvtPlaneToPix cvMerge src0 đầu vào kênh 0 src1 đầu vào kênh 1 src2 đầu vào kênh 2 src3 đầu vào kênh 3 dst Điểm đến mảng Hàm là ngượ c lại vớ i cvSplit. Nếu các mảng đích N kênh sau đó nếu ngườ i đầu tiên N kênh đầu vào là không NULL, t ất cả chúng đều đượ c sao chép vào m ảng đích; nếu chỉ có một nguồn duy nhất kênh N đầu tiên không phải là NULL, kênh này đượ c sao chép vào mảng đích; nếu không một lỗi đượ c nâng lên. Phần còn lại của các kênh ngu ồn (ngoài N đầu tiên) phải luôn luôn là NULL. Đối v ớ i IplImage cvCopy vớ i COI thiết l ập c ũng có thể đượ c s ử dụng để chèn một kênh duy nhất vào hình ảnh. cvMin Tìm thấy tối thiểu mỗi phần tử của hai mảng. void cvMin(const CvArr* src1, const CvArr* src2, CvArr* dst); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai dst Các mảng đích Hàm tính toán t ối thiểu cho mỗi phần tử của hai mảng: dst (I) = min (src1 (I), src2 (I)) Tất cả các mảng phải có một kênh duy nhất, kiểu dữ liệu giống nhau và kích thướ c tươ ng tự (hoặc thu nhập từ đầu kích thướ c). cvMinMaxLoc Tìm thấy toàn cầu tối thiểu và tối đa trong mảng hoặc subarray. void cvMinMaxLoc(const CvArr* arr, double* minVal, double* maxVal, CvPoint* minLoc=NULL, CvPoint* maxLoc=NULL, const CvArr* mask=NULL); arr mảng nguồn, đơ n kênh hoặc đa kênh vớ i COI thiết lập minVal Pointer giá tr ị tối thiểu trở lại maxVal Pointer giá tr ị tối đa trở lại minLoc con trỏ đến vị trí tối thiểu trở lại maxLoc con trỏ đến vị trí tối đa trả lại mask mặt nạ tùy chọn đượ c sử dụng để lựa chọn một subarray Hàm tìm thấy giá trị của các ph ần t ử tối thiểu và tối đa và vị trí của họ. Các extremums đượ c tìm kiếm qua toàn bộ mảng, chọn ROI (trong trườ ng hợ p của IplImage) hoặc, nếu mask không phải là 54
NULL, trong khu vực mảng quy định. Nếu mảng có nhiều hơ n một kênh, nó phải đượ c IplImage Sau khi COI thiết lập. Trong trườ ng ng hợ p mảng đa chiều, minLoc-> x và maxLoc-> x s ẽ chứa nguyên (tuyến tính) vị trí của extremums. cvMinS Tìm thấy tối thiểu cho mỗi phần tử của một mảng và một vô hướ ng. ng. void cvMinS(const CvArr* src, double value, CvArr* dst); src Các mảng nguồn đầu tiên value giá trị vô hướ ng ng dst Các mảng đích Hàm tính toán t ối thiểu của một mảng và một vô hướ ng: ng: dst(I) = min(src(I), value) Tất cả các mảng phải có một kênh duy nhất, kiểu dữ liệu giống nhau và kích thướ c tươ ng ng tự (hoặc thu nhập từ đầu kích thướ c). c). Mirror Đồng ngh ĩ a vớ i hàm Flip. cvMixChannels Bản sao một số kênh từ mảng đầu vào các kênh c ủa mảng đầu ra void cvMixChannels(const CvArr** src, int srcCount, CvArr** dst, int dstCount, const int* fromTo, int pairCount); src đầu vào mảng srcCount số mảng đầu vào. dst Điểm đến mảng dstCount Số lượ ng ng các mảng đầu ra. fromTo mảng của các c ặp của các chỉ số của các máy bay sao chép. fromTo Các mảng c ủa các cặp c ủa các ch ỉ số của các máy bay sao chép.fromTo [k * 2] là ch ỉ số 0 của kênh đầu vào trong src và fromTo [k * 2 +1] là ch ỉ số của các kênh đầu ra trong dst.Số kênh liên tục đượ c s ử dụng, có ngh ĩ a là, các kênh đầu vào hình ảnh đầu tiên đượ c lập chỉ mục từ 0 đến channels (src [0]) -1, các kênh đầu vào hình ảnh thứ hai đượ c lập chỉ mục từ các channels (src [0]) channels (src[0]) + channels (src [1]) -1 v.v, và các ch ươ ng ng trình tươ ng ng tự đượ c s ử dụng cho các kênh hình ảnh đầu ra.Như một tr ườ ng ng h ợ p đặc bi ệt, khi fromTo [k * 2] là tiêu cực, các kênh đầu ra tươ ng ng ứng là đầy vớ i số không. Hàm là một dạng tổng quát của cvSplit và cvMerge và m ột số hình thức của CvtColor. Nó có thể đượ c sử dụng để thay đổi thứ tự của những chiếc máy bay, thêm / g ỡ bỏ các kênh alpha, giải nén hoặc chèn một một máy bay hoặc máy bay nhiều. Ví dụ, mã này chia tách 4-kênh RGBA hình ảnh vào một 3-kênh BGR (tức là vớ i R và B trao đổi) và kênh alpha hình ảnh riêng biệt: CvMat* rgba = cvCreateMat(100, 100, CV_8UC4); CvMat* bgr = cvCreateMat(rgba->rows, rgba->cols, CV_8UC3); CvMat* alpha = cvCreateMat(rgba->rows, rgba->cols, CV_8UC1); cvSet(rgba, cvScalar(1,2,3,4)); CvArr* out[] = { bgr, alpha }; int from_to[] = { 0,2, 1,1, 2,0, 3,3 }; 55
cvMixChannels(&bgra, 1, out, 2, from_to, 4); MulAddS Đồng ngh ĩ a cho ScaleAdd. cvMul Tính sản phẩm cho mỗi phần tử của hai mảng. void cvMul(const CvArr* src1, const CvArr* src2, CvArr* dst, double scale=1); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai dst Các mảng đích scale tùy ch ọn quy mô yếu tố Hàm tính toán các s ản phẩm cho mỗi phần tử của hai mảng: dst(I) = scale . src1(I) . src2(I) Tất cả các mảng phải có cùng loại và kích th ướ c t ươ ng ng t ự (hoặc kích thướ c ROI). Đối v ớ i các loại có hạn chế phạm vi hoạt động này đượ c bão hòa. cvMulSpectrums Thực hiện mỗi phần tử nhân của hai quang ph ổ Fourier. void cvMulSpectrums( const CvArr* src1, const CvArr* src2, CvArr* dst, int flags); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai dst mảng điểm đến của cùng loại và kích thướ c giống như các mảng nguồn flags Một sự kết hợ p của các giá tr ị sau; CV_DXT_ROWS xử lý m ỗi hàng c ủa các mảng như là m ột quang phổ riêng biệt (xem các thông s ố mô tả cvDFT). CV_DXT_MUL_CONJ liên hợ p các mảng nguồn thứ hai trướ c khi nhân r ộng. Hàm thực hiện phép nhân cho m ỗi phần tử của hai ma tr ận CCS-đóng gói hoặc phức tạp là kết quả của một thực hay phức tạp biến đổi Fourier. Hàm, cùng vớ i cvDFT, có thể đượ c sử dụng để tính tích chập của hai mảng nhanh chóng. •
•
cvMulTransposed Tính sản phẩm của một mảng và một mảng hoán. void cvMulTransposed(const CvArr* src, CvArr* dst, int order, const CvArr* delta=NULL, double scale=1.0); src Các ma trận nguồn dst ma trận điểm đến. Phải CV_32F hoặc CV_64F. order Sắp xếp thứ tự của số nhân 56
delta Một mảng tùy chọn, trừ từ src trướ c khi nhân scale Một tùy chọn mở rộng quy mô Hàm tính toán là s ản phẩm của src và chuyển vị của nó: dst = scale(src - delta)(src - delta)T nếu order = 0, và dst = scale(src - delta) T (src - delta) khác. cvNorm Tính toán mảng tuyệt đối tiêu chuẩn, định m ức khác biệt tuyệt đối, hoặc định m ức chênh lệch tươ ng ng đối. double cvNorm(const CvArr* arr1, const CvArr* arr2=NULL, int normType=CV L2, const CvArr* mask=NULL); arr1 Các nguồn hình ảnh đầu tiên arr2 Các hình ảnh nguồn th ứ hai. Nếu nó là NULL, ch ỉ tiêu tuyệt đối c ủa arr1 đượ c tính toán, nếu không các chỉ tiêu tuyệt đối hay tươ ng ng đối của arr1, arr2 đượ c tính toán. normType Loại định mức, xem các cu ộc thảo luận mask mặt nạ hoạt động tùy chọn Hàm tính toán các ch ỉ tiêu tuyệt đối arr1 nếu arr2 là NULL:
hoặc định mức chênh lệch tươ ng ng đối nếu arr2 không phải là NULL
hoặc định mức chênh lệch tươ ng ng đối nếu arr2 không phải là NULL và (normType & CV_RELATIVE) !=0:
Hàm trả về các chỉ tiêu tính toán. Một mảng nhiều kênh đượ c xử lý như một đơ n kênh, có ngh ĩ a là, các k ết quả cho tất cả các kênh đượ c kết hợ p. p. cvNot Thực hiện cho mỗi phần tử đảo bit-khôn ngoan của các yếu tố mảng. void cvNot(const CvArr* src, CvArr* dst); src Các mảng nguồn dst Các mảng đích Hàm ngượ c mỗi bit của mỗi phần tử mảng: dst(I)=˜src(I) 57
cvOr Tính mỗi yếu tố bit khôn ngoan phân ly của hai mảng. void cvOr(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL); src1 Các mảng nguồn đầu tiên src2 Các mảng nguồn thứ hai dst Các mảng đích mask mặt nạ hoạt động, 8-bit kênh mảng; quy định cụ thể các yếu t ố của mảng đích đượ c thay đổi Hàm tính toán cho mỗi phần tử bit-khôn ngoan phân ly của hai mảng: dst (I) = src1 (I) | src2 (I) Trong trườ ng hợ p mảng điểm nổi đại diện bit đượ c sử dụng cho hoạt động. Tất cả các mảng phải có cùng loại, trừ mặt nạ, và kích th ướ c giống nhau. cvOrS Tính toán một yếu tố cho mỗi bit-khôn ngoan phân ly của một mảng và một vô hướ ng. void cvOrS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL); src Các mảng nguồn value vô hướ ng để sử dụng trong hoạt động dst Các mảng đích mask mặt nạ hoạt động, 8-bit kênh mảng; quy định cụ thể các yếu t ố của mảng đích đượ c thay đổi ORS Hàm tính toán phân ly m ỗi phần tử bit-khôn ngoan của một mảng và một vô hướ ng: dst(I)=src(I)|value if mask(I)!=0 Trướ c khi hoạt động thực tế, vô hướ ng đượ c chuyển đổi cùng loại như của mảng (s). Trong trườ ng hợ p của các mảng đại diện của họ bit floating-point đượ c sử dụng cho hoạt động. Tất cả các mảng phải có cùng loại, trừ mặt nạ, và kích thướ c giống nhau. cvPerspectiveTransform Thực hiện chuyển đổi ma trận quan điểm của một mảng vector. void cvPerspectiveTransform(const CvArr* src, CvArr* dst, const CvMat* mat); src Nguồn ba kênh mảng nổi điểm dst Điểm đến ba kênh mảng nổi điểm mat 3 x 3 hoặc 4 × 4 chuyển đổi ma trận Hàm biến đổi mọi phần tử của src (bằng cách xử lý nó như là vector 2D hoặc 3D) như sau như sau: (x, y, z) → (x’ / w, y’ / w, z’/w) nơ i (x’, y’, z’, w’) = mat · [x y z 1] Và
cvPolarToCart Tính tọa độ Đề-các vectơ 2d đại diện trong hình thức cực. void cvPolarToCart( const CvArr* magnitude, const CvArr* angle, 58
CvArr* x, CvArr* y, int angleInDegrees=0); magnitude Các mảng độ lớ n của biên độ. Nếu nó là NULL, biên độ đượ c giả định là tất cả 1. angle xoay nhiều góc độ, cho dù trong radian ho ặc độ x Các mảng đích của x-tọa độ, có thể đượ c thiết lập để NULL nếu nó không phải là cần thiết y Các mảng đích của y-tọa độ, mau đượ c thiết lập để NULL nếu nó không phải là cần thiết angleInDegrees Lá cờ cho biết các góc đượ c đo bằng radian, là ch ế độ mặc định, hoặc ở các mức độ Hàm tính toán ho ặc x-coodinate, y- coodinate ho ặc cả hai của tất cả các cườ ng độ vector magnitude (I) * exp (angle(I) * j), j = sqrt (-1): x(I)=magnitude(I)*cos(angle(I)), y(I)=magnitude(I)*sin(angle(I)) cvPow Tăng tất cả các phần tử mảng quyền lực. void cvPow( const CvArr* src, CvArr* dst, double power); src Các mảng nguồn dst Mảng đích, nên đượ c cùng loại như là nguồn gốc power số mũ của quyền lực Hàm làm tăng mọi phần tử của mảng đầu vào để p: Đó là, một số mũ điện không nguyên các giá tr ị tuyệt đối của các ph ần tử mảng đầu vào đượ c sử dụng.Tuy nhiên, nó có thể để có đượ c giá trị đích thực cho các giá tr ị tiêu cực bằng cách sử dụng một số hoạt động thêm, như ví dụ sau đây, tính căn bậc ba của các phần tử mảng, cho thấy: CvSize size = cvGetSize(src); CvMat* mask = cvCreateMat(size.height, size.width, CV_8UC1); cvCmpS(src, 0, mask, CV_CMP_LT); /* find negative elements */ cvPow(src, dst, 1./3); cvSubRS(dst, cvScalarAll(0), dst, mask); /* negate the results of negative inputs */ cvReleaseMat(&mask); Đối vớ i một số giá trị của quyền lực, chẳng hạn như các giá tr ị số nguyên, 0,5, và -0,5, chuyên các thuật toán nhanh hơ n đượ c sử dụng.
1.3 Cấu trúc động CvMemStorage Gia tăng bộ nhớ lưu trữ. typedef struct CvMemStorage { struct CvMemBlock* bottom; / * đầu tiên đượ c phân bổ khối * / 59
struct CvMemBlock* top; * / * khối bộ nhớ hiện tại trên cùng của ngăn xếp * / struct CvMemStorage* parent; / * vay m ớ i từ khối * / int block\_size; / * kích th ướ c khối * / int free\_space; / * mi ễn phí không gian trong khối \ {đầu} texttt (theo byte) * / } CvMemStorage; Bộ nhớ lưu trữ là một cấu trúc ở mức độ thấp đượ c sử dụng để lưu trữ các cấu trúc dữ liệu dynamicly như trình tự, đườ ng nét, đồ thị, phân khu, vv, đượ c t ổ chức nh ư một danh sách c ủa các khối bộ nhớ của bằng kích thướ c dướ i cùng l ĩ nh vực là sự khở i đầu của danh sách các kh ối và các đầu khối hiện đang đượ c sử dụng, nhưng không nhất thiết phải là khối cuối cùng của danh sách. Tất cả các khối từ phía dướ i và phía trên, không bao gồm thứ hai, đượ c coi là hoàn toàn bị chiếm đóng, tất c ả các khối t ừ đầu và ngăn ch ặn cu ối cùng, không bao gồm hàng đầu, đượ c coi là mi ễn phí và đầu tự nó là một phần ocupied - miễn phí không gian ch ứa s ố lượ ng byte miễn phí còn lại vào cuối hàng đầu. Một bộ nhớ đệm mớ i có thể đượ c phân bổ một cách rõ ràng theo Hàm cvMemStorageAlloc hoặc implicitly Hàm cấp cao hơ n, chẳng hạn nh ư cvSeqPush, cvGraphAddEdge, vv, luôn luôn bắt đầu kết thúc của khối hiện tại nếu nó phù hợ p vớ i có. Sau khi phân b ổ, không gian miễn phí đượ c giảm đi kích thướ c của bộ đệm đượ c phân bổ cộng vớ i một số padding để giữ sự liên kết thích hợ p. Khi đượ c phân bổ bộ đệm không phù hợ p vớ i thành phần có sẵn c ủa đầu, khối lưu trữ tiếp theo từ danh sách đượ c thực hiện như không gian hàng đầu và miễn phí đượ c thiết lập lại kích thướ c khối toàn bộ trướ c khi việc phân bổ. Nếu không có các khối tự do hơ n, một khối mớ i đượ c giao (hoặc vay từ cha mẹ, xem ) cvCreateChildMemStorage và thêm vào cuối danh sách. Vì v ậy, lưu trữ các hoạt động như một chồng phía dướ i chỉ ra dướ i cùng của ngăn xếp và một đôi (hàng đầu, không gian miễn phí) cho thấy đầu của stack. Đầu ngăn xếp có thể đượ c lưu thông qua cvSaveMemStoragePos, ph ục hồi thông qua cvRestoreMemStoragePos, ho ặc thiết lập lại thông qua cvClearStorage. CvMemBlock Bộ nhớ lưu trữ khối. typedef struct CvMemBlock { struct CvMemBlock* prev; struct CvMemBlock* next; } CvMemBlock; CvMemBlock cấu trúc đại diện cho một khối duy nhất của bộ nhớ lưu trữ. Các dữ liệu thực tế trong các khối bộ nhớ theo tiêu đề, đó là, byte th ứ i của khối bộ nhớ có thể đượ c lấy ra vớ i biểu thức ((char*)(mem_block_ptr+1))[i]. Tuy nhiên, có bình th ườ ng không cần phải truy cập vào các l ĩ nh vực cấu trúc lưu trữ trực tiếp. CvMemStoragePos Bộ nhớ lưu trữ vị trí. typedef struct CvMemStoragePos { CvMemBlock* top; int free\_space; } CvMemStoragePos; Cấu trúc mô tả ở trên các c ửa hàng vị trí của đỉnh ngăn xếp có thể đượ c lưu thông qua cvSaveMemStoragePos và phục hồi thông qua cvRestoreMemStoragePos. 60
CvSeq Growable trình tự của các yếu tố. #define CV_SEQUENCE\_FIELDS() \ int flags; /* micsellaneous flags */ \ int header_size; /* size of sequence header */ \ struct CvSeq* h_prev; /* previous sequence */ \ struct CvSeq* h_next; /* next sequence */ \ struct CvSeq* v_prev; /* 2nd previous sequence */ \ struct CvSeq* v_next; /* 2nd next sequence */ \ int total; /* total number of elements */ \ int elem_size;/* size of sequence element in bytes */ \ char* block_max;/* maximal bound of the last block */ \ char* ptr; /* current write pointer */ \ int delta_elems; /* how many elements allocated when the sequence grows (sequence granularity) */ \ CvMemStorage* storage; /* where the seq is stored */ \ CvSeqBlock* free_blocks; /* free blocks list */ \ CvSeqBlock* first; /* pointer to the first sequence block */ typedef struct CvSeq { CV_SEQUENCE_FIELDS() } CvSeq; CvSeq cấu trúc là cơ sở cho tất cả các của OpenCV cấu trúc dữ liệu động. Một định ngh ĩ a khác thườ ng thông qua một macro trợ giúp đơ n giản hóa phần mở rộng của CvSeq cấu trúc vớ i các thông s ố bổ sung. Để mở rộng CvSeq ngườ i sử dụng có thể định ngh ĩ a một c ấu trúc mớ i, đưa ng ườ i s ử dụng xác định các l ĩ nh v ực sau khi tất c ả các l ĩ nh v ực CvSeq đượ c bao gồm thông qua các trình t ự LĨNH VỰ C v ĩ mô CV (). Có hai loại chuỗi - dày đặc và thưa th ớ t. Các loại c ơ sở cho chuỗi dày đặc, CvSeq và trình tự như vậy đượ c sử dụng để đại diện cho mảng growable 1d - vect ơ , ngăn xếp, hàng đợ i, và deques. Họ không có khoảng trống ở giữa - nếu m ột ph ần t ử đượ c l ấy ra từ giữa hay đưa vào giữa trình tự, các yếu tố từ khi kết thúc gần hơ n đượ c thay đổi. Thưa thớ t trình tự có CvSet như là một lớ p cơ sở và họ sẽ đượ c thảo luận chi tiết hơ n. Họ là trình tự của các nút, m ỗi có thể đượ c ho ặc chiếm hoặc miễn phí như đượ c chỉ ra bở i lá cờ nút. Như vậy trình tự đượ c sử dụng cho dữ liệu không có thứ tự các cấu trúc như bộ của các yếu tố, đồ thị, bảng băm và vv. header size l ĩ nh v ực có chứa các kích thướ c th ực t ế của tiêu đề trình tự và c ần ph ải đượ c l ớ n hơ n hơ n hoặc bằng sizeof(CvSeq). Các h_prev, h_next, v_prev, v_next có th ể đượ c sử dụng để tạo ra các cấu trúc phân c ấp từ riêng biệt trình tự. Các trườ ng h trướ c và h điểm tiếp theo đến trướ c đó và trình tự tiếp theo trên cùng một cấp độ thứ bậc, trong khi các l ĩ nh v ực v trướ c và v ti ếp theo điểm tr ướ c đó và trình tự tiếp theo trong hướ ng thẳng đứng, có ngh ĩ a là, cha m ẹ và đứa con đầu tiên của mình. Nhưng đây là những chỉ tên và các con tr ỏ có thể đượ c sử dụng theo một cách khác. Trườ ng đầu tiên first để khối thứ tự đầu tiên, có cấu trúc đượ c mô tả dướ i đây. Trườ ng total có số lượ ng thực t ế của các yếu t ố trình tự dày đặc và số lượ ng c ủa phân bổ các nút trong một chuỗi thưa thớ t. Trườ ng flags có chứa các loại chữ ký đặc biệt năng động (CV_SEQ_MAGIC_VAL dày đặc trình tự và CV_SET_MAGIC_VAL cho chuỗi thưa thớ t) trong 16 bit cao nhất và miscella 61
neous thông tin về trình tự. Th ấp nh ất c ủa CV_SEQ_ELTYPE_BITS bit chứa các ID của lo ại yếu t ố. Hầu h ết các Hàm xử lý chuỗi không sử dụng loại yếu tố mà là elem_size đượ c l ưu giữ trong kích thướ c Elem. Nếu chuỗi có chứa các dữ liệu s ố một c ủa CvMat loại sau đó các loại yếu tố phù hợ p để loại yếu tố CvMat tươ ng ứng, ví dụ như, CV_32SC2 có thể đượ c sử dụng cho một chuỗi các điểm 2D, CV_32FC1 cho các chu ỗi giá trị dấu chấm động, v.v. CV_SEQ_ELTYPE (seq_header_ptr) v ĩ mô lấy các loại của các yếu tố trình tự. Chế biến Hàm làm việc vớ i chuỗi số kiểm tra xem kích th ướ c Elem bằng mà tính từ kích thướ c phần tử loại. Bên cạnh đó các loại CvMat tươ ng thích, có r ất ít loại yếu tố thêm quy định tại tiêu đề cvtypes.h: Các loại tiêu chuẩn của các yếu tố trình tự #define CV_SEQ_ELTYPE_POINT CV_32SC2 /* (x,y) */ #define CV_SEQ_ELTYPE_CODE CV_8UC1 /* freeman code: 0..7 */ #define CV_SEQ_ELTYPE_GENERIC 0 /* unspecified type of sequence elements */ #define CV_SEQ_ELTYPE_PTR CV_USRTYPE1 /* =6 */ #define CV_SEQ_ELTYPE_PPOINT CV_SEQ_ELTYPE_PTR /* &elem: pointer to element of other sequence */ #define CV_SEQ_ELTYPE_INDEX CV_32SC1 /* #elem: index of element of some other sequence */ #define CV_SEQ_ELTYPE_GRAPH_EDGE CV_SEQ_ELTYPE_GENERIC /* &next_o, &next_d, &vtx_o, &vtx_d */ #define CV_SEQ_ELTYPE_GRAPH_VERTEX CV_SEQ_ELTYPE_GENERIC /* first_edge, &(x,y) */ #define CV_SEQ_ELTYPE_TRIAN_ATR CV_SEQ_ELTYPE_GENERIC /* vertex of the binary tree */ #define CV_SEQ_ELTYPE_CONNECTED_COMP CV_SEQ_ELTYPE_GENERIC /* connected component */ #define CV_SEQ_ELTYPE_POINT3D CV_32FC3 /* (x,y,z) */ CV_SEQ_KIND_BITS bit chỉ định các loại trình tự: Các loại tiêu chuẩn của Sequences /* Chung (không xác định) của chuỗi */#define CV_SEQ_KIND_GENERIC (0 << CV_SEQ_ELTYPE_BITS) /* dense sequence suntypes */ #define CV_SEQ_KIND_CURVE (1 << CV_SEQ_ELTYPE_BITS) #define CV_SEQ_KIND_BIN_TREE (2 << CV_SEQ_ELTYPE_BITS) /* sparse sequence (or set) subtypes */ #define CV_SEQ_KIND_GRAPH (3 << CV_SEQ_ELTYPE_BITS) #define CV_SEQ_KIND_SUBDIV2D (4 << CV_SEQ_ELTYPE_BITS) Các bit còn lại đượ c s ử dụng để xác định các tính năng khác nhau c ụ thể vớ i các loại trình tự nhất định và yếu t ố loại. Ví dụ, các đườ ng cong làm b ằng điểm (CV SEQ HÌNH THỨ C ĐƯỜNG CONG | CV SEQ ELTYPE POINT), cùng vớ i lá cờ CV SEQ FLAG CLOSED, thuộc về loại CV SEQ đa giác, hoặc nếu các lá c ờ khác 62
đượ c s ử dụng, kiểu ph ụ của nó. Nhiều Hàm xử lý đườ ng viền ki ểm tra các loại c ủa chuỗi đầu vào và báo cáo một l ỗi nếu họ không hỗ trợ kiểu này. Cvtypes.h tập tin lưu trữ danh sách đầy đủ của tất cả các loại hỗ trợ đượ c xác định trướ c chuỗi và macro trợ giúp đượ c thiết kế để có đượ c những loại chuỗi các tài sản khác. Định ngh ĩ a của các khối xây dựng của các chu ỗi có thể đượ c tìm thấy d ướ i đây.
CvSeqBlock Khối chuỗi liên tục. typedef struct CvSeqBlock { struct CvSeqBlock* prev; /* previous sequence block */ struct CvSeqBlock* next; /* next sequence block */ int start_index; /* index of the first element in the block + sequence->first->start_index */ int count; /* number of elements in the block */ char* data; /* pointer to the first element of the block */ } CvSeqBlock; Khối Trình tự lập một danh sách liên kết đôi tròn, vì vậy các con trỏ trướ c và tiếp theo là không bao giờ NULL và điểm trướ c đó và ngăn chặn các trình tự tiếp theo trong chuỗi. Nó có ngh ĩ a là tiếp theo của khối cuối cùng là kh ối đầu tiên và trướ c của khối đầu tiên là khối cuối cùng. Các trườ ng startIndex và đếm để theo dõi vị trí khối trong trình tự. Ví dụ, nếu trình tự bao gồm 10 yếu tố và phân chia thành ba khối 3, 5, và 2 yếu tố, và khối đầu tiên có startIndex tham s ố = 2, sau đó cặp (startIndex, count) trình tự các khối (2,3), (5, 5), và (10, 2) t ươ ng ứng. StartIndex tham s ố của khối đầu tiên thườ ng là 0, trừ khi một số yếu tố đã đượ c đưa vào đầu của chuỗi. CvSlice Một lát trình tự. typedef struct CvSlice { int start_index; int end_index; } CvSlice; inline CvSlice cvSlice( int start, int end ); #define CV_WHOLE_SEQ_END_INDEX 0x3fffffff #define CV_WHOLE_SEQ cvSlice(0, CV_WHOLE_SEQ_END_INDEX) /* calculates the sequence slice length */ int cvSliceLength( CvSlice slice, const CvSeq* seq ); Một số Hàm hoạt động trên các trình tự phải mất một tham số lát CvSlice là mườ i thiết lập trình tự toàn bộ (CV TOÀN SEQ) theo mặc định. Một trong các startIndex endIndex có thể đượ c tiêu cực hoặc vượ t quá độ dài chuỗi, startIndex bao g ồm, và endIndex 63
là m ột ranh giớ i độc quyền. Nếu chúng bằng nhau, cắt miếng đượ c coi là rỗng (tức là, không ele ments). Bở i vì trình tự đang đượ c coi là cấu trúc hình tròn, lát có th ể lựa chọn một vài yếu tố vào cuối của một chuỗi tiếp theo là một vài yếu tố ở đầu của chuỗi. Đối vớ i cũ phong phú, cvSlice (-2, 3) trong trườ ng hợ p c ủa một chuỗi 10-yếu t ố sẽ chọn một slice 5 ph ần tử, có tiền cuối cùng (8), (9), đầu tiên (0), thứ hai (1Th) và thứ ba (2) yếu tố. Các Hàm bình thườ ng hóa các đối số slice trong các cách sau: đầu tiên cvSliceLength, đượ c gọi là xác định độ dài của slice, sau đó, startIndex của slice đượ c chuẩn hóa tươ ng tự như các ar gument cvGetSeqElem (t ức là, chỉ số tiêu cực đượ c phép). Lát th ực tế để xử lý bắt đầu từ startIndex bình thườ ng và kéo dài các y ếu tố cvSliceLength (một lần nữa, giả sử chuỗi là một cấu trúc tròn). Nếu một Hàm không chấp nhận một đối số slice, nhưng bạn muốn quá trình chỉ là một phần của trình tự, trình tự phụ có thể đượ c chiết xuất bằng cách sử dụng Hàm cvSeqSlice, ho ặc đượ c lưu trữ vào một liên tục đệm vớ i CvtSeqToArray (tùy ch ọn, theo sau bở i cvMakeSeqHeaderForArray). CvSet Bộ sưu tập của các nút. typedef struct CvSetElem { int flags; /* it is negative if the node is free and zero or positive otherwise */ struct CvSetElem* next_free; /* if the node is free, the field is a pointer to next free node */ } CvSetElem; #define CV_SET_FIELDS() \ CV_SEQUENCE_FIELDS() /* inherits from [#CvSeq CvSeq] */ \ struct CvSetElem* free_elems; /* list of free nodes */ typedef struct CvSet { CV_SET_FIELDS() } CvSet; CvSet cấu trúc là cơ sở cho cấu trúc dữ liệu OpenCV thưa thớ t. Như sau tuyên bố trên, CvSet thừa hưở ng từ CvSeq và nó cho biết thêm elems mi ễn phí l ĩ nh vực, mà là một danh sách các nút mi ễn phí, vớ i nó. Mỗi nút thiết lập, cho dù miễn phí hay không, là một phần tử của cơ bản trình tự. Trong khi có không h ạn chế về các yếu tố của chuỗi dày đặc, các thiết lập (Và có nguồn gốc cấu trúc) các yếu tố phải bắt đầu vớ i một trườ ng số nguyên và có thể phù hợ p vớ i CvSetElem cấu trúc, bở i vì hai l ĩ nh vực (một số nguyên theo sau bở i một con trỏ) đượ c yêu cầu cho Orga nization của một nút thiết lập vớ i danh sách của các nút t ự do. Nếu một nút nào là miễn phí, l ĩ nh vực cờ là tiêu cực 64
(Bit quan trọng nhất, MSB, của l ĩ nh vực này đượ c thiết lập), và miễn phí tớ i các điểm đến miễn phí tiếp theo nút (nút đầu tiên đượ c tham chiếu bở i trườ ng elems miễn CvSet). Và nếu một nút là chiếm, l ĩ nh vực cờ là tích cực và có chứa các ch ỉ số nút có thể đượ c lấy ra bằng cách sử dụng (thiết lập Elem-> cờ & CV SET Elem IDX MASK) các bi ểu thức, phần còn lại c ủa nội dung nút đượ c xác định bở i ng ườ i s ử dụng. Đặc bi ệt, các nút bị chiếm đóng không liên kết v ớ i các nút miễn phí đượ c, vì vậy trườ ng thứ hai có thể đượ c sử dụng cho liên k ết như vậy cũng như đối vớ i một số mục đích khác nhau. Các v ĩ mô CV IS SET Elem (thiết lập Elem ptr) có th ể đượ c sử dụng để xác định liệu các nút đượ c chỉ định là chiếm đóng hay không. Ban đầu thiết lập và danh sách có sản phẩm nào. Khi một nút mớ i đượ c yêu cầu từ thiết lập, nó đượ c thực hiện từ danh sách của các nút, sau đó cập nhật. Nếu danh sách trống rỗng, một chuỗi mớ i khối đượ c cấp phát và t ất cả các nút trong khối đượ c tham gia vào danh sách các nút t ự do. Như vậy, tổng số l ĩ nh vực c ủa b ộ này là tổng s ố của các nút b ị chiếm đóng và miễn phí. Khi một chiếm đóng nút đượ c phát hành, nó đượ c thêm vào danh sách các nút t ự do. Các nút phát hành cu ối cùng sẽ đượ c chiếm đóng đầu tiên. Trong CvSet OpenCV đượ c sử dụng để đại diện cho đồ thị (CvGraph), thưa thớ t đa chiều mảng (CvSparseMat), và các phân khu phẳng CvSubdiv2D. CvGraph Định hướ ng đồ thị trọng unoriented. #define CV_GRAPH_VERTEX_FIELDS() \ int flags; /* vertex flags */ \ struct CvGraphEdge* first; /* the first incident edge */ typedef struct CvGraphVtx { CV_GRAPH_VERTEX_FIELDS() } CvGraphVtx; #define CV_GRAPH_EDGE_FIELDS() \ int flags; /* edge flags */ \ float weight; /* edge weight */ \ struct CvGraphEdge* next[2]; /* the next edges in the incidence lists for staring (0) * /* and ending (1) vertices */ \ struct CvGraphVtx* vtx[2]; /* the starting (0) and ending (1) vertices */ typedef struct CvGraphEdge { CV_GRAPH_EDGE_FIELDS() } CvGraphEdge; #define CV_GRAPH_FIELDS() \ 65
CV_SET_FIELDS() /* set of vertices */ \ CvSet* edges; /* set of edges */ typedef struct CvGraph { CV_GRAPH_FIELDS() } CvGraph; CvGraph cấu trúc là cơ sở cho các đồ thị đượ c sử dụng trong OpenCV. Cấu trúc đồ thị đượ c th ừa hưở ng từ CvSet - trong đó mô tả các thuộc tính đồ thị thông thườ ng và các đỉnh đồ thị, và có một thiết lập như là một thành viên - trong đó mô tả các cạnh đồ thị. Các đỉnh, cạnh, và các c ấu trúc tiêu đề đồ thị đượ c khai báo bằng cách sử dụng kỹ thuật tươ ng tự như OpenCV khác thể mở rộng cấu trúc - thông qua các macro, đơ n giản hóa việc mở rộng và tuỳ biến của các c ấu trúc. Trong khi các c ấu trúc đỉnh và cạnh không kế thừa từ CvSetElem một cách rõ ràng, đáp ứng cả hai điều kiện các yếu t ố theo quy định: có một trườ ng số nguyên trong đầu và phù hợ p trong cấu trúc CvSetElem. Các l ĩ nh v ực c ờ đượ c s ử dụng để chỉ ra đỉnh chiếm đóng và cạnh cũng như cho các mục đích khác, ví d ụ, đồ thị traversal (xem cvCreateGraphScanner et al.), do đó, nó là tốt hơ n không sử dụng chúng trực tiếp. Đồ thị đượ c biểu diễn như là một tập hợ p của các cạnh trong đó có một danh sách của các c ạnh sự cố. Các danh sách t ớ i đối vớ i các đỉnh khác nhau xen k ẽ để tránh trùng lặp càng nhiều thông tin posssible. Đồ thị có thể đượ c định h ướ ng hoặc unoriented. Trong trườ ng hợ p th ứ hai không có distiction giữa cạnh kết nối đỉnh A vớ i B đỉnh và cạnh các kết nối đỉnh B vớ i đỉnh A - chỉ một trong số họ có thể tồn tại trong đồ thị tại cùng một thờ i điểm và nó đại diện cho cả hai AB và BA cạnh. CvGraphScanner Biểu đồ traversal nhà n ướ c. typedef struct CvGraphScanner { CvGraphVtx* vtx; /* current graph vertex (or current edge origin) */ CvGraphVtx* dst; /* current graph edge destination vertex */ CvGraphEdge* edge; /* current edge */ CvGraph* graph; /* the graph */ CvSeq* stack; /* the graph vertex stack */ int index; /* the lower bound of certainly visited vertices */ int mask; /* event mask */ } CvGraphScanner; CvGraphScanner cấu trúc đượ c sử dụng cho sâu đầu tiên của đồ thị traversal. Xem th ảo luận của Hàm dướ i đây. CV_TREE_NODE_FIELDS Helper v ĩ mô để kê khai một loại nút cây. 66
CV_TREE_NODE_FIELDS đượ c sử dụng để khai báo các cấu trúc có thể đượ c tổ chức vào thứ bậc strucutures (cây), chẳng hạn như CvSeq - loại cơ bản cho tất cả các cấu trúc năng động. Các cây đượ c tạo ra vớ i các nút tuyên b ố bằng cách sử dụng macro này có thể đượ c xử lý bằng cách sử dụng các Hàm mô tả dướ i đây trong phần này. CvTreeNodeIterator Mở hiện tại hoặc tạo ra tập tin lưu trữ mớ i. typedef struct CvTreeNodeIterator { const void* node; int level; int max_level; } CvTreeNodeIterator; #define CV_TREE_NODE_FIELDS(node_type) \ int flags; /* micsellaneous flags */ \ int header_size; /* size of sequence header */ \ struct node_type* h_prev; /* previous sequence */ \ struct node_type* h_next; /* next sequence */ \ struct node_type* v_prev; /* 2nd previous sequence */ \ struct node_type* v_next; /* 2nd next sequence */ CvTreeNodeIterator c ấu trúc đượ c sử dụng để đi qua cây. Mỗi nút cây nên bắt đầu vớ i một số l ĩ nh v ực đượ c xác định b ở i CV TREE NODE (...) LĨNH V Ự C v ĩ mô. Trong C + + về, mỗi cây nút phải là một cấu trúc "bắt nguồn" từ struct _BaseTreeNode { CV_TREE_NODE_FIELDS(_BaseTreeNode); } CvSeq, CvSet, CvGraph và các c ấu trúc năng động khác có nguồn gốc từ CvSeq thực hiện theo yêu cầu. cvClearGraph Xóa một đồ thị. void cvClearGraph( CvGraph* graph ); graph đồ thị Hàm loại bỏ tất cả các đỉnh và các cạnh của một đồ thị. Hàm có O (1) th ờ i gian complexity. cvClearMemStorage Xóa bộ nhớ lưu trữ. void cvClearMemStorage( CvMemStorage* storage ); storage Bộ nhớ lưu trữ Thiết l ập lại Hàm hàng đầu (miễn phí không gian ranh giớ i) c ủa lưu tr ữ để bắt đầu. Điều này Hàm này không deallocate b ất kỳ bộ nhớ . Nếu lưu trữ có một phụ huynh, Hàm trả về tất cả khối để phụ huynh. 67
cvClearSeq Xóa một chuỗi. void cvClearSeq( CvSeq* seq ); seq trình tự Hàm loại bỏ tất cả các yếu tố từ một chuỗi. Các Hàm không trả lại phần mềm khối lưu trữ ORY, nhưng bộ nhớ này đượ c tái sử dụng sau khi các yếu tố mớ i đượ c thêm vào trình tự. Hàm có 'O (1)' th ờ i gian phức tạp. cvClearSet Xóa một Set. void cvClearSet( CvSet* setHeader ); setHeader rà phá thi ết lập Hàm loại bỏ tất cả các yếu tố từ thiết lập. Nó có phức tạp thờ i gian O (1). cvCloneGraph Bản sao một đồ thị. CvGraph* cvCloneGraph(const CvGraph* graph,CvMemStorage* storage ); graph để đồ thị sao chép storage container để sao chép Hàm tạo ra một bản sao đầy đủ của đồ thị quy định. Nếu các đỉnh đồ thị hoặc cạnh con trỏ đến một số dữ liệu bên ngoài, nó vẫn có thể đượ c chia sẻ giữa các bản sao. Các đỉnh và cạnh chỉ số trong đồ thị mớ i có thể khác nhau từ bản gốc bở i vì Hàm chống phân mảnh The bộ đỉnh và cạnh. cvCloneSeq Tạo một bản sao của một chuỗi. CvSeq* cvCloneSeq(const CvSeq* seq, CvMemStorage* storage=NULL ); seq tiếp theo trình tự storage Các lưu trữ đích khối để giữ tiêu đề trình tự và các dữ liệu đượ c sao chép, nếu b ất k ỳ. Nếu nó là NULL, Hàm s ử dụng khối lưu trữ có chứa các chuỗi đầu vào. Hàm làm cho một bản sao hoàn chỉnh của chuỗi đầu vào và trả về nó. Các cuộc gọi cvCloneSeq( seq, storage ) tươ ng đươ ng vớ i cvSeqSlice( seq, CV_WHOLE_SEQ, storage, 1 ) cvCreateChildMemStorage Tạo bộ nhớ lưu trữ trẻ em. CvMemStorage* cvCreateChildMemStorage(CvMemStorage* parent); parent lưu trữ bộ nhớ cha Hàm tạo ra một bộ nhớ lưu trữ của con là t ươ ng tự như bộ nhớ lưu trữ đơ n giản, ngoại trừ cho sự khác biệt trong cơ chế phân bổ / deallocation b ộ nhớ . Khi một đứa trẻ cần l ưu trữ một kh ối mớ i để thêm vào danh sách ch ặn, nó sẽ cố gắng để có đượ c khối này từ cha mẹ. Trống đầu tiên cha mẹ có sẵn khối đượ c thực hiện và bị loại khỏi danh sách chặn mẹ. Nếu không có các khối có sẵn, cha mẹ hoặc phân bổ một khối hoặc vay mượ n m ột t ừ cha mẹ của riêng mình, n ếu có. Nói cách khác, dây chuyền, hay một cấu trúc phức tạp hơ n, kho bộ nhớ nơ i lưu trữ tất cả là 68
một đứa tr ẻ / ph ụ huynh của khác là có thể. Khi lưu tr ữ trẻ em đượ c phát hành hoặc th ậm chí xóa, nó sẽ trả về tất cả các khối. cha mẹ. Trong các khía c ạnh khác, con lưu trữ là tươ ng tự như lưu trữ đơ n giản. Lưu trữ con là hữu ích trong tình huống sau đây. Hãy tưở ng tượ ng rằng ngườ i sử dụng cần để quá trình dữ liệu động cư trú trong một khu vực lưu trữ và đặt kết quả trở lại vớ i cùng một khu vực l ưu tr ữ. V ớ i cách tiếp c ận đơ n giản, khi dữ liệu t ạm th ờ i cư trú tại cùng một khu vực l ưu trữ như là đầu vào và các dữ liệu đầu ra, khu vực lưu trữ sẽ xem xét như sau sau khi chế biến: Năng động, xử lý dữ liệu mà không cần sử dụng lưu trữ con.
Đó là, rác xuất hiện ở giữa dung lượ ng lưu trữ. Tuy nhiên, nếu một trong tạo ra một bộ nhớ con lưu trữ vào lúc bắt đầu chế biến, ghi dữ liệu tạm thờ i ở đó, và phát hành lưu trữ con Cuối cùng, không có rác thải sẽ xuất hiện trong nguồn / đích lưu trữ: Năng động, xử lý dữ liệu bằng cách sử dụng một lưu trữ con
cvCreateGraph Tạo ra một đồ thị rỗng. CvGraph* cvCreateGraph( int graph flags, int header size, int vtx size, int edge size, CvMemStorage* storage ); graph_flags Loại đồ thị của đồ thị đượ c tạo ra. Thông thườ ng, nó là một trong hai CV_SEQ_KIND_GRAPH cho chung unoriented đồ thị và CV_SEQ_KIND_GRAPH | CV_GRAPH_FLAG_ORIENTED theo định hướ ng chung chung oriented đồ thị. header_size kích thướ c đồ thị tiêu đề, không có thể ít hơ n so vớ i sizeof (CvGraph) vtx_size kích thướ c đồ thị đỉnh, đỉnh tùy chỉnh cấu trúc phải bắt đầu vớ i CvGraphVtx( sử dụng CV GRAPH VERTEX FIELDS() ) 69
storage container l ưu trữ Hàm tạo ra một đồ thị rỗng và trả về một con trỏ đến nó. cvCreateGraphScanner Tạo cấu trúc sâu đầu tiên của đồ thị traversal. CvGraphScanner* cvCreateGraphScanner( CvGraph* graph, CvGraphVtx* vtx=NULL, int mask=CV GRAPH ALL ITEMS ); graph đồ thị vtx đỉnh ban đầu để bắt đầu từ. Nếu NULL, cây bắt đầu từ đỉnh đầu tiên (một đỉnh vớ i tối thiểu chỉ mục trong trình tự của các đỉnh). mask Sự kiện mặt nạ cho thấy những sự kiện đượ c ngườ i dùng quan tâm (nơ i cvNextGraphItem Hàm trả về kiểm soát cho ngườ i sử dụng) có thể đượ c CV_GRAPH_ALL_ITEMS tất cả các mục (tất cả các sự kiện có liên quan) hoặc sự kết hợ p của những lá cờ sau đây: CV GRAPH VERTEX dừng lại ở các đỉnh đồ thị truy cập cho lần đầu tiên CV GRAPH TREE EDGE dừng lại ở cạnh cây (tree edge là các c ạnh kết nối cuối cùng visited đỉnh và các đỉnh đượ c truy cập tiếp theo) CV GRAPH BACK EDGE dừng l ại ở cạnh trở lại (back edge là một c ạnh k ết n ối cu ối cùng đối vớ i đỉnh vớ i một số tổ tiên của nó trong cây tìm ki ếm) CV GRAPH FORWARD EDGE dừng lại ở cạnh phía trướ c (forward edge là một c ạnh conecting cuối cùng đã đến thăm đỉnh vớ i một số hậu duệ của nó trong cây tìm ki ếm. Phía trướ c cạnh chỉ có thể trong định hướ ng đồ thị traversal) CV GRAPH CROSS EDGE dừng lại ở cạnh chéo (cross edge là m ột cạnh khác nhau kết nối tìm kiếm cây hoặc chi nhánh c ủa cùng một cây. Các cross edge ch ỉ có thể có trong định hướ ng đồ thị traversal) CV GRAPH ANY EDGE dừng cạnh bất kỳ ((tree, back, forward, và cross edges) CV GRAPH NEW TREE dừng lại ở sự bắt đầu của tất cả các cây tìm kiếm mớ i. Khi các traversal th ủ tục truy cập vào tất cả các đỉnh và các cạnh có thể truy cập từ đỉnh ban đầu (các truy cập đỉnh cùng vớ i các cạnh cây làm cho cây), tìm ki ếm đối vớ i một số đỉnh ghé thăm thườ ng xuyên trong đồ thị và hồ sơ quá trình traversal từ đỉnh đó. Trướ c khi bắt đầu mớ i cây (bao gồm cả cây đầu tiên, khi cvNextGraphItem đượ c g ọi là lần đầu tiên) nó tạo ra một đồ thị sự kiện CV_GRAPH_NEW_TREE. Đối vớ i các đồ thị unoriented, mỗi cây tìm kiếm tươ ng ứng vớ i một thành phần kết nối của đồ thị. CV GRAPH BACKTRACKING thụt lùi tại tất cả đã đến thăm đỉnh trong thờ i gian thụt lùi - trở lại đã viếng thăm các đỉnh của cây traversal. Hàm này tạo ra một c ấu trúc sâu đầu tiên đồ thị traversal / search. Cấu trúc khở i tạo đượ c s ử dụng trong cvNextGraphItem Hàm - traversal th ủ tục gia tăng. cvCreateMemStorage Tạo bộ nhớ lưu trữ. CvMemStorage* cvCreateMemStorage( int blockSize=0 ); blockSize Kích thướ c c ủa các khối lưu tr ữ trong byte. Nếu nó là 0, kích thướ c kh ối đượ c thiết lập để giá trị mặc định hiện nay nó là khoảng 64K. Hàm tạo ra một bộ nhớ lưu trữ trống. Xem mô tả CvMemStorage. 70
cvCreateSeq Tạo một chuỗi. CvSeq* cvCreateSeq( int seqFlags, int headerSize, int elemSize, CvMemStorage* storage); seqFlags Flags của chuỗi đượ c t ạo ra. Nếu chuỗi không đượ c thông qua bất k ỳ Hàm làm việc vớ i một loại hình cụ thể trình tự, chuỗi giá trị có thể đượ c thiết lập là 0, nếu khôngloại thích hợ p phải đượ c lựa chọn từ danh sách các lo ại trình tự đượ c xác định trướ c. headerSize Kích th ướ c của tiêu đề trình tự, phải lớ n hơ n hoặc bằng sizeof (CvSeq). Nếu một loại hình cụ thể hoặc gia hạn của nó đượ c chỉ định, loại hình này phải phù hợ p vớ i những tiêu đề kiểu cơ sở . elemSize Kích thướ c c ủa các yếu t ố trình tự trong byte. Kích thướ c ph ải phù hợ p v ớ i loại. Ví dụ, đối vớ i một chuỗi các điểm đượ c tạo ra, nguyên tố các loại CV SEQ ELTYPE POINT nên đượ c quy định cụ thể và các elemSize tham s ố phải có bằng sizeof (CvPoint). storage Trình tự vị trí Hàm tạo ra một chuỗi và trả về con trỏ đến nó. Hàm giao tiêu đề trong các khối lưu trữ như là đoạn liên tục và thiết lập cơ cấu các l ĩ nh vực flags, elemSize, headerSize, và storage các giá tr ị thông qua, bộ delta_elems vớ i giá trị mặc định (Có thể đượ c bố trí bằng cách sử dụng Hàm cvSetSeqBlockSize), và xóa các l ĩ nh vực tiêu đề khác, bao gồm cả không gian đầu tiên sizeof(CvSeq) byte. cvCreateSet Tạo một tập rỗng. CvSet* cvCreateSet( int set flags, int header size, int elem size, CvMemStorage* storage ); set_flags Loại thiết lập đượ c tạo ra header_size kích thướ c kích thướ c tiêu đề; không có thể ít hơ n so vớ i sizeof (CvSet) elem_size Thiết lập kích thướ c kích thướ c ; có thể không đượ c ít hơ n CvSetElem storage container l ưu trữ cho thiết lập Hàm này tạo ra một tập rỗng vớ i kích thướ c tiêu đề quy định và yếu tố kích thướ c, và trả về con trỏ để thiết lập. Hàm này chỉ là một lớ p mỏng trên đầu trang của cvCreateSeq. cvCvtSeqToArray Bản sao một chuỗi liên tục để ngăn chặn một bộ nhớ . void* cvCvtSeqToArray( const CvSeq* seq, void* elements, CvSlice slice=CV WHOLE SEQ ); seq trình tự elements con trỏ để mảng đích phải đủ lớ n. Nó phải là một con trỏ đến dữ liệu, không phải là một tiêu đề ma trận. slice Phần trình tự sao chép vào mảng 71
Hàm sao chép toàn bộ chuỗi hoặc dãy các bộ đệm và trả về con trỏ đến bộ đệm. cvEndWriteSeq Kết thúc quá trình viết một chuỗi. CvSeq* cvEndWriteSeq( CvSeqWriter* writer ); writer Writer state Hàm kết thúc quá trình bằng văn bản và trả về con trỏ đến chuỗi bằng văn bản. Các Hàm cũng cắt các khối không đầy đủ trình tự cuối cùng để trả lại phần còn lại của khối để lưu trữ bộ nhớ . Sau đó, trình tự có thể đượ c đọc và sửa đổi một cách an toàn. Xem cvcvStartWriteSeq và cvcvStartAppendToSeq cvFindGraphEdge Tìm thấy một lợ i thế trong một đồ thị. CvGraphEdge* cvFindGraphEdge( const CvGraph* graph, int start_idx, int end_idx ); #define cvGraphFindEdge cvFindGraphEdge graphđồ thị start_idx của đỉnh bắt đầu của cạnh end_idx kết thúc của đỉnh kết thúc của cạnh. Đối vớ i một đồ thị unoriented, thứ tự của đỉnh các thông số không quan trọng. Hàm tìm thấy cạnh biểu đồ kết nối hai đỉnh quy định và trả về một con trỏ đến nó hoặc NULL nếu cạnh không tồn tại. cvFindGraphEdgeByPtr Tìm một cạnh trong một đồ thị bằng cách sử dụng con trỏ của nó. CvGraphEdge* cvFindGraphEdgeByPtr( const CvGraph* graph, const CvGraphVtx* startVtx, const CvGraphVtx* endVtx ); #define cvGraphFindEdgeByPtr cvFindGraphEdgeByPtr graph đồ thị startVtx Pointer bắt đầu từ đỉnh của cạnh endVtx Pointer đỉnh kết thúc của cạnh. Đối vớ i một đồ thị unoriented, thứ tự của đỉnh các thông số không quan trọng. Hàm tìm cạnh biểu đồ kết nối hai đỉnh quy định và trả về con trỏ đến nó. NULL nếu cạnh không tồn tại. cvFlushSeqWriter Tiêu đề trình tự cập nhật từ nhà văn. void cvFlushSeqWriter( CvSeqWriter* writer ); writer Writer state Hàm đượ c thiết kế để cho phép ngườ i dùng đọc các yếu tố theo thứ tự, bất cứ khi nào cần thiết, trong quá trình viết, ví dụ như, để kiểm tra điều ki ện c ụ thể. Hàm cập nh ật tiêu đề trình tự để làm cho vi ệc đọc trình tự có thể. Tác giả không phải là đóng cửa, tuy nhiên, để quá trình viết có thể đượ c tiếp tục bất cứ lúc nào. Nếu một thuật toán đòi hỏi phải xóa thườ ng xuyên, xem xét việc sử dụng cvSeqPush thay vì. cvGetGraphVtx Tìm thấy một đồ thị đỉnh bằng cách sử dụng chỉ số của nó. 72
CvGraphVtx* cvGetGraphVtx( CvGraph* graph, int vtx idx ); graph Graph vtx_idx Index của đỉnh Hàm tìm thấy đồ thị đỉnh bằng cách sử dụng chỉ số của nó và trả về con trỏ đến nó hoặc NULL nếu đỉnh không thuộc về đồ thị. cvGetSeqElem Trả về một con trỏ đến một yếu tố trình tự theo chỉ số của nó. char* cvGetSeqElem( const CvSeq* seq, int index ); #define CV_GET_SEQ_ELEM(TYPE, seq,index)(TYPE*)cvGetSeqElem((CvSeq*)(seq),(index) ) seq trình tự index chỉ số của nguyên tố Hàm tìm thấy các phần tử vớ i các chỉ số đượ c đưa ra trong trình t ự và trả về con trỏ tớ i nó. Nếu phần tử không tìm thấy, Hàm trả về 0. Hàm hỗ trợ chỉ số tiêu cực, -1 Là viết tắt của các yếu tố trình tự, -2 là viết tắt của một trong những trướ c khi cuối cùng, vv Nếu các trình tự rất có thể bao gồm một khối thứ tự hoặc các yếu tố mong muốn có thể đặt trong khối đầu tiên, sau đó v ĩ mô CV_GET_SEQ_ELEM (elemType, seq, index) nên đượ c đượ c sử dụng, nơ i elemType tham s ố là loại yếu t ố thứ tự (CvPoint ví dụ), seq tham s ố là một chuỗi, và chỉ số tham số là chỉ số của phần t ử mong muốn. V ĩ mô sẽ kiểm tra lần đầu tiên cho dù các yếu tố mong muốn thuộc về khối đầu tiên của chuỗi và trả lại nó nếu nó không, nếu không v ĩ mô các cuộc g ọi GetSeqElem Hàm chính. Tiêu c ực ch ỉ số luôn luôn gây ra các cuộc gọi cvGetSeqElem. Hàm O (1) th ờ i gian giả định phức tạp số khối nhỏ hơ n nhiều hơ n số lượ ng các yếu tố. cvGetSeqReaderPos Trả về vị trí đầu đọc hiện tại. int cvGetSeqReaderPos( CvSeqReader* reader ); reader Reader state Hàm trả về vị trí ngườ i đọc hiện tại (trong 0 ... đọc-> seq-> tổng - 1). cvGetSetElem Tìm thấy một yếu tố đượ c thiết lập bở i chỉ số của nó. CvSetElem* cvGetSetElem( const CvSet* setHeader, int index ); setHeader Set Index chỉ số của phần tử thiết lập trong một chuỗi Hàm tìm thấy một yếu t ố đượ c thiết l ập bở i ch ỉ số của nó. Hàm trả về con trỏ đến nó hoặc 0 nếu chỉ số là không hợ p lệ hoặc các nút tươ ng ứng là miễn phí. Hàm này hỗ trợ chỉ số tiêu cực như nó sử dụng cvGetSeqElem để xác định vị trí các nút. cvGraphAddEdge Thêm một cạnh một đồ thị. 73
int cvGraphAddEdge( CvGraph* graph, int start idx, int end idx, const CvGraphEdge* edge=NULL, CvGraphEdge** inserted edge=NULL ); graph đồ thị start_idx chỉ số của đỉnh bắt đầu của cạnh end_idx Index kết thúc của đỉnh kết thúc của c ạnh. Đối v ớ i m ột đồ thị unoriented, thứ tự của đỉnh các thông số không quan trọng. edge tham số đầu vào cạnh tùy chọn, khở i tạo dữ liệu cho cạnh inserted_edge tùy ch ọn đầu ra tham số để chứa các địa chỉ của cạnh đượ c chèn vào Hàm kết nối hai đỉnh quy định. Hàm trả về 1 nếu cạnh đã đượ c thêm thành công, 0 n ếu các cạnh nối hai đỉnh đã tồn tại và -1 nếu một trong các đỉnh không đượ c tìm thấy, bắt đầu và đỉnh kết thúc là như nhau, hoặc có khác một số quan trọng tình hình. Trong trườ ng hợ p thứ hai (tức là, khi kết quả là âm tính), Hàm cũng báo cáo một lỗi theo mặc định. cvGraphAddEdgeByPtr Thêm một cạnh một đồ thị bằng cách sử dụng con trỏ của nó. int cvGraphAddEdgeByPtr( CvGraph* graph, CvGraphVtx* start vtx, CvGraphVtx* end vtx, const CvGraphEdge* edge=NULL, CvGraphEdge** inserted edge=NULL ); graph đồ thị start_vtx Con trỏ trỏ tớ i đỉnh bắt đầu của cạnh end_vtx Con trỏ trỏ tớ i đỉnh kết thúc c ủa c ạnh. Đối vớ i một đồ thị unoriented, thứ tự của đỉnh các thông số không quan trọng. edge tham số đầu vào cạnh tùy chọn, khở i tạo dữ liệu cho cạnh inserted_edge tùy ch ọn đầu ra tham số để chứa các địa ch ỉ của c ạnh đượ c chèn vào bên trong tập cạnh. Hàm kết n ối hai đỉnh quy định. Hàm trả về 1 nếu c ạnh đã đượ c thêm thành công, 0 n ếu c ạnh nối hai đỉnh đã t ồn tại, và -1 nếu một trong các đỉnh không đượ c tìm thấy, bắt đầu và đỉnh k ết thúc là như nhau hoặc có khác một s ố quan trọng tình hình. Trong tr ườ ng h ợ p th ứ hai (tức là, khi kết quả là âm tính), Hàm cũng báo cáo một lỗi theo mặc định. cvGraphAddVtx Thêm một đỉnh một đồ thị. int cvGraphAddVtx( CvGraph* graph, const CvGraphVtx* vtx=NULL, CvGraphVtx** inserted vtx=NULL ); graph đồ thị vtx Tùy chọn đầu vào đối số đượ c sử dụng để khở i tạo đỉnh gia tăng (chỉ ngườ i sử dụng xác định các l ĩ nh vực vượ t ra ngoài sizeof (CvGraphVtx) đượ c sao chép) 74
inserted_vertex đầu ra tùy chọn đỉnh. Nếu không phải là NULL, địa chỉ của đỉnh mớ i viết ở đây. Hàm bổ sung thêm một đỉnh để vẽ đồ thị và trả về chỉ số đỉnh. cvGraphEdgeIdx Trả về chỉ số cạnh đồ thị. int cvGraphEdgeIdx( CvGraph* graph, CvGraphEdge* edge ); graph đồ thị edge con trỏ để cạnh đồ thị Hàm trả về chỉ số cạnh đồ thị. cvGraphRemoveEdge Loại bỏ một cạnh từ một đồ thị. void cvGraphRemoveEdge( CvGraph* graph, int start idx, int end idx ); graph đồ thị start_idx chỉ số của đỉnh bắt đầu của cạnh end_idx kết thúc của đỉnh kết thúc của cạnh. Đối vớ i một đồ thị unoriented, thứ tự của đỉnh các thông số không quan trọng. Hàm loại bỏ các cạnh nối hai đỉnh quy định. Nếu các đỉnh không còn [theo thứ tự], Hàm không có gì. cvGraphRemoveEdgeByPtr Loại bỏ một cạnh từ một đồ thị bằng cách sử dụng con trỏ của nó. void cvGraphRemoveEdgeByPtr( CvGraph* graph, CvGraphVtx* start vtx, CvGraphVtx* end vtx ); graph đồ thị start_vtx Con trỏ trỏ tớ i đỉnh bắt đầu của cạnh end_vtx Con trỏ trỏ tớ i đỉnh kết thúc c ủa c ạnh. Đối vớ i một đồ thị unoriented, thứ tự của đỉnh các thông số không quan trọng. Hàm loại bỏ các cạnh nối hai đỉnh quy định. Nếu các đỉnh không còn nected [theo thứ tự], Hàm không có gì. cvGraphRemoveVtx Loại bỏ một đỉnh từ một đồ thị. int cvGraphRemoveVtx( CvGraph* graph, int index ); graph đồ thị vtx_idx Index đỉnh loại bỏ 75
Hàm loại bỏ một đỉnh t ừ một đồ thị cùng vớ i t ất cả các vụ việc c ạnh để nó. Các Hàm báo cáo lỗi nếu đỉnh đầu vào không thuộc về đồ thị. Giá trị trả về là số của các cạnh đã bị xóa, hoặc -1 nếu đỉnh không thuộc về đồ thị. cvGraphRemoveVtxByPtr Loại bỏ một đỉnh từ một đồ thị bằng cách sử dụng con trỏ của nó. int cvGraphRemoveVtxByPtr( CvGraph* graph, CvGraphVtx* vtx ); graph đồ thị vtx con trỏ đến đỉnh loại bỏ Hàm loại bỏ một đỉnh của đồ thị bằng cách sử dụng con trỏ của nó cùng vớ i tất cả các cạnh sự việc cho nó. Hàm báo cáo m ột l ỗi n ếu đỉnh không thuộc đồ thị. S ự trở lại giá trị là s ố của các cạnh bị xóa, hoặc -1 nếu các đỉnh không thuộc về đồ thị. cvGraphVtxDegree Đếm số của các cạnh indicent đỉnh. int cvGraphVtxDegree( const CvGraph* graph, int vtxIdx ); graph đồ thị vtxIdx Index của đỉnh đồ thị Hàm trả về số của các c ạnh sự cố đỉnh quy định, cả hai vào và gửi đi. Để đếm các cạnh, các mã sau đây đượ c sử dụng: CvGraphEdge* edge = vertex->first; int count = 0; while( edge ) { edge = CV_NEXT_GRAPH_EDGE( edge, vertex ); count++; } Các v ĩ mô CV_NEXT_GRAPH_EDGE ( edge, vertex) tr ả về vụ việc vertex theo sau khi edge. cvGraphVtxDegreeByPtr Tìm thấy một lợ i thế trong một đồ thị. int cvGraphVtxDegreeByPtr(const CvGraph* graph,const CvGraphVtx* vtx ); graph đồ thị vtx con trỏ đến đỉnh đồ thị Hàm trả về số của các c ạnh sự cố đỉnh quy định, cả hai vào và outcoming. cvGraphVtxIdx Trả về chỉ số của một đồ thị đỉnh. int cvGraphVtxIdx(CvGraph* graph,CvGraphVtx* vtx ); graph đồ thị vtx con trỏ đến đỉnh đồ thị Hàm trả về chỉ số của một đỉnh của đồ thị. cvInitTreeNodeIterator Khở i tạo biến lặp nút cây. void cvInitTreeNodeIterator(CvTreeNodeIterator* tree iterator, const void* first,int max level ); tree_iterator cây kh ở i tạo bở i Hàm first nút ban đầu để bắt đầu đi qua từ 76
max_level mức độ tối đa của cây (first nút giả định là ở cấp độ đầu tiên) để đi qua đến. Ví dụ, 1 có ngh ĩ a là các nút ch ỉ ở mức độ tươ ng tự như first phải đượ c truy cập, 2 có ngh ĩ a là các nút trên cùng cấp như là first và trẻ em trực tiếp của họ nên đượ c truy cập, và vv. Hàm khở i tạo biến lặp cây. Cây là đi qua sâu sắc lệnh đầu tiên. cvInsertNodeIntoTree Thêm một nút mớ i vào cây. void cvInsertNodeIntoTree(void* node,void* parent,void* frame ); node Các nút chèn parent Phụ huynh nút cha đã có trong cây frame Khung nút cấp cao nhất. N ếu parent và frame đều giống nhau, v_prev trườ ng c ủa node đượ c thiết lập NULL thay vì phải là parent. Hàm bổ sung thêm một nút vào cây. Hàm không phân b ổ bộ nhớ , nó có thể chỉ sửa đổi các liên k ết của các nút cây. cvMakeSeqHeaderForArray Xây dựng một tiêu đề trình tự cho một mảng. CvSeq* cvMakeSeqHeaderForArray(int seq type,int header size,int elem size,void* elements,int total,CvSeq* seq,CvSeqBlock* block ); seq_type loại hình của chuỗi đượ c tạo ra header_size Kích thướ c của phần đầu của chuỗi. Thông số thứ tự phải điểm đến cấu trồng thủy kích thướ c đó hoặc cao hơ n elem_size Kích th ướ c của các yếu tố chuỗi elements Các yếu tố đó sẽ tạo thành một chuỗi total Tổng số phần t ử trong chuỗi. S ố lượ ng các phần tử mảng phải bằng v ớ i giá trị của tham số này. seq con trỏ vào biến địa phươ ng đượ c sử dụng như tiêu đề trình tự block Con trỏ trỏ tớ i biến địa phươ ng là tiêu đề của khối chuỗi Hàm khở i t ạo một tiêu đề trình tự cho một m ảng. Các tiêu đề trình tự cũng như các khối trình tự đượ c phân bổ bở i ng ườ i s ử dụng (ví dụ, trên stack). Không có d ữ liệu đượ c sao chép Hàm. Chuỗi kết quả sẽ bao gồm m ột khối duy nhất và có con tr ỏ lưu tr ữ NULL, do đó, nó là có th ể đọc các phần tử của nó, nhưng những n ỗ lực để thêm các yếu tố trình tự sẽ nâng cao một lỗi trong nhiều trườ ng hợ p. cvMemStorageAlloc Cấp phát một bộ nhớ đệm trong một khối lưu trữ. void* cvMemStorageAlloc(CvMemStorage* storage,size t size ); storage lưu trữ lưu trữ size bộ đệm kích thướ c Hàm cấp phát một bộ nhớ đệm trong một khối lưu trữ. Kích thướ c bộ đệm không đượ c vượ t quá kích thướ c lưu trữ khối, nếu không một lỗi thờ i gian chạy đượ c nêu ra. Địa chỉ đệm phù hợ p CV_STRUCT_ALIGN = sizeof(double) (đối vớ i thờ i điểm này) byte. cvMemStorageAllocString Cấp phát một chuỗi văn bản trong một khối lưu trữ. CvString cvMemStorageAllocString(CvMemStorage* storage, const char* ptr, int len=-1); typedef struct CvString 77
{ int len; char* ptr;
} CvString; storage bộ nhớ lưu trữ ptr Chuỗi len Chiều dài của chuỗi (không kể NULL kết thúc). Nếu tham số này là tiêu c ực, Hàm tính chiều dài. Hàm tạo bản sao của chuỗi trong bộ nhớ lưu trữ. Nó trả về các cấu trúc có chứa ngườ i sử dụng thông qua hoặc tính toán chiều dài của chuỗi và con trỏ đến chuỗi sao chép. cvNextGraphItem Thực hiện một hoặc nhiều bướ c của thủ tục đồ thị traversal. int cvNextGraphItem( CvGraphScanner* scanner ); scanner đồ thị traversal nhà nướ c. Nó đượ c cập nhật Hàm này. Các Hàm đi qua thông qua các đồ thị cho đến khi một sự kiện của ngườ i dùng quan tâm (có ngh ĩ a là, một sự kiện, quy định trong mask trong các cu ộc gọi cvCreateGraphScanner) đượ c đáp ứng hoặc traversal đượ c hoàn thành. Trong trườ ng hợ p đầu tiên, nó sẽ trả về một trong các sự kiện đượ c liệt kê trong mô t ả của các tham s ố mask trên và v ớ i các cuộc gọi tiếp theo sơ yếu lý lịch các traversal. Trong tr ườ ng hợ p thứ hai, nó sẽ trả CV_GRAPH_OVER(-1). Khi sự kiện này là CV_GRAPH_VERTEX, CV_GRAPH_BACKTRACKING, hoặc CV_GRAPH_NEW_TREE, hiện đang quan sát đỉnh đượ c lưu tr ữ trong scanner->vtx. Và n ếu sự kiện liên quan đến cạnh, cạnh chính nó đượ c l ưu tr ữ ở cạnh scanner->edge, truy c ập trướ c đó đỉnh scanner->vtx và khác k ết thúc đỉnh của cạnh - tại scanner->dst. cvNextTreeNode Trả về nút hiện đang quan sát và di chuy ển iterator về phía nút tiếp theo. void* cvNextTreeNode( CvTreeNodeIterator* tree iterator ); tree_iterator cây iterator kh ở i tạo bở i Hàm Các Hàm trả về nút hiện đang quan sát và sau đó c ập nhật các biến l ặp - di chuyển nó đối v ớ i các nút tiếp theo. Nói cách khác, hành vi Hàm t ươ ng tự như biểu hiện *p++ trên điển hình con trỏ C hoặc C++ bộ sưu tập iterator. Hàm tr ả về NULL nếu không có các nút h ơ n. cvPrevTreeNode Trả về nút hiện đang quan sát và di chuy ển iterator về phía nút trướ c đó. void* cvPrevTreeNode( CvTreeNodeIterator* tree iterator ); tree_iterator cây Iterator kh ở i tạo bở i Hàm Các Hàm trả về nút hiện đang quan sát và sau đó c ập nhật các biến l ặp - di chuyển nó đối v ớ i các nút trướ c đó. Nói cách khác, hành vi Hàm t ươ ng tự như *p-- biểu hiện trên một con trỏ C hoặc C++ bộ sưu tập iterator. Hàm tr ả về NULL nếu có không các nút. cvReleaseGraphScanner Hoàn thành thủ tục traversal đồ thị. void cvReleaseGraphScanner( CvGraphScanner** scanner ); scanner đúp con trỏ đến biểu đồ traverser Hàm hoàn thành th ủ tục traversal đồ thị và phát hành nhà nướ c traverser. 78
cvReleaseMemStorage Phiên bản bộ nhớ lưu trữ. void cvReleaseMemStorage( CvMemStorage** storage ); storage Pointer để lưu trữ phát hành Hàm deallocates t ất cả các khối bộ nhớ lưu trữ hoặc trả về cho phụ huynh, nếu có. Sau đó, deallocates tiêu đề lưu trữ và xóa các con tr ỏ để lưu trữ. Tất cả các lưu trữ liên quan đến trẻ em vớ i cha mẹ khối lưu trữ phải đượ c phát hành trướ c khi lưu trữ khối mẹ đượ c phát hành. cvRestoreMemStoragePos Phục hồi vị trí bộ nhớ lưu trữ. void cvRestoreMemStoragePos(CvMemStorage* storage,CvMemStoragePos* pos); storage bộ nhớ lưu trữ pos New vị trí lưu trữ hàng đầu Hàm khôi phục l ại vị trí đầu l ưu tr ữ từ pos tham số. Hàm này và cvClearMemStorage Hàm là phươ ng pháp duy nhất để giải phóng bộ nhớ bị chiếm đóng trong bộ nhớ khối. L ưu ý một l ần nữa rằng không có cách nào để bộ nhớ miễn phí ở giữa của một phần chiếm đóng của một l ưu trữ khối. cvSaveMemStoragePos Tiết kiệm bộ nhớ lưu trữ vị trí. void cvSaveMemStoragePos(const CvMemStorage* storage,CvMemStoragePos* pos); storage bộ nhớ lưu trữ pos Vị trí đầu ra của đầu lưu trữ Hàm sẽ lưu vị trí hiện tại của đầu l ưu tr ữ để pos tham số. Các Hàm cvRestoreMemStoragePos hơ n nữa có thể lấy vị trí này. cvSeqElemIdx Trả về chỉ số của một yếu tố thứ tự cụ thể. int cvSeqElemIdx(const CvSeq* seq,const void* element,CvSeqBlock** block=NULL ); seq trình tự element con tr ỏ vào phần tử trong dãy block đối số tùy chọn. Nếu con trỏ không phải là NULL, địa chỉ của khối trình tự có chứa yếu tố đượ c lưu trữ trong vị trí này. Hàm trả về chỉ số của một yếu tố trình tự hoặc một số tiêu cực nếu phần tử không tìm thấy. cvSeqInsert Chèn một phần tử ở giữa của một dãy. char* cvSeqInsert( CvSeq* seq, int beforeIndex, void* element=NULL ); seq trình tự beforeIndex Index trướ c khi mà yếu tố đượ c đưa vào. Chèn tr ướ c khi 0 (tối thiểu cho phép giá trị của tham số này) bằng cvSeqPushFront và chèn trướ c khi seq->total (giá trị tối đa cho phép của tham số này) là bằng cvSeqPush. element Chèn yếu tố Hàm thay đổi các yếu t ố trình tự từ vị trí đượ c chèn vào cuối g ần nh ất c ủa trình tự và các bản sao nội dung phần tử có nếu con trỏ không phải là NULL. Các Hàm tr ả về một con trỏ đến các yếu tố đượ c chèn vào. 79
cvSeqInsertSlice Chèn một mảng ở giữa của một dãy. void cvSeqInsertSlice( CvSeq* seq, int beforeIndex, const CvArr* fromArr ); seq trình tự slice một phần của trình tự để loại bỏ fromArr mảng để các yếu tố từ Hàm chèn tất cả các yếu tố mảng fromArr tại vị trí quy định trình tự. Các fromArr mảng có thể là một ma trận hay trình tự khác. cvSeqInvert Đảo ngượ c thứ tự của các yếu tố trình tự. void cvSeqInvert( CvSeq* seq ); seq trình tự Hàm đảo ngượ c trình tự tại chỗ - làm cho các yếu tố đầu tiên đi cuối cùng, yếu tố cuối cùng đi đầu tiên và vv. cvSeqPop Loại bỏ một phần tử từ ngày kết thúc của một chuỗi. void cvSeqPop( CvSeq* seq, void* element=NULL ); seq trình tự element tùy ch ọn tham số. N ếu con trỏ không phải là bằng không, các Hàm sao chép các y ếu tố loại bỏ vị trí này. Hàm loại bỏ một phần t ử từ một chuỗi. Hàm báo cáo một lỗi nếu đã đượ c sản phẩm nào. Hàm có O (1) phức tạp. cvSeqPopFront Loại bỏ một phần tử từ đầu của một chuỗi. void cvSeqPopFront( CvSeq* seq, void* element=NULL ); seq trình tự element tùy ch ọn tham số. N ếu con trỏ không phải là bằng không, các Hàm sao chép các y ếu tố loại bỏ vị trí này. Hàm loại bỏ một phần tử từ đầu của một chuỗi. Hàm báo cáo một lỗi nếu trình tự đã đượ c sản phẩm nào. Hàm có O (1) ph ức tạp. cvSeqPopMulti Loại bỏ một số yếu tố từ hai đầu của một chuỗi. void cvSeqPopMulti( CvSeq* seq, void* elements, 80
int count, int in front=0 ); seq trình tự elements Loại bỏ các yếu tố count Số đếm của các yếu tố để bật in_front lá cờ xác định kết thúc của chuỗi sửa đổi. CV_BACK các yếu tố đượ c thêm vào cu ối của chuỗi CV_FRONT các yếu tố đượ c thêm vào đầu của chuỗi Hàm loại bỏ một số yếu tố từ hai đầu của chuỗi. Nếu số lượ ng các yếu tố đượ c loại bỏ vượ t quá số lượ ng tổng số các yếu tố trong trình tự, Hàm loại bỏ các yếu tố nhiều càng tốt. cvSeqPush Thêm một yếu tố để kết thúc của một chuỗi. char* cvSeqPush( CvSeq* seq, void* element=NULL ); seq trình tự element yếu tố gia tăng Hàm bổ sung thêm một yếu tố để kết thúc của một chuỗi và trả về một con trỏ đến các tạp yếu tố. Nếu các element đầu vào là NULL, Hàm chỉ đơ n giản là phân bổ không gian cho thêm một phần tử. Các mã sau đây chứng minh làm thế nào để tạo ra một chuỗi mớ i bằng cách sử dụng Hàm này: CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* seq = cvCreateSeq( CV_32SC1, /* chuỗi các yếu tố số nguyên */ sizeof(CvSeq),/* kích thướ c tiêu đề không có thêm các l ĩ nh vực */ sizeof(int), /* yếu tố kích thướ c */ storage /* lưu trữ container */); int i; for( i = 0; i < 100; i++ ) { int* added = (int*)cvSeqPush( seq, &i ); printf( "%d is added\n", *added ); } ... /* Giải phóng bộ nhớ lưu trữ cuối cùng */ cvReleaseMemStorage( &storage ); Hàm có O (1) phức tạp, nhưng có một phươ ng pháp nhanh hơ n để viết các chu ỗi lớ n (xem cvStartWriteSeq và các Hàm liên quan). cvSeqPushFront Thêm một yếu tố để bắt đầu của một chuỗi. char* cvSeqPushFront( CvSeq* seq, void* element=NULL ); seq trình tự element yếu tố gia tăng Hàm này tươ ng tự như cvSeqPush nhưng nó cho biết thêm các yếu t ố mớ i để bắt đầu của trình tự. Hàm có O (1) phức tạp. 81
cvSeqPushMulti Đẩy một số yếu tố đến hai đầu của một chuỗi. void cvSeqPushMulti( CvSeq* seq, void* elements, int count, int in front=0 ); seq trình tự elements tăng yếu tố gia count số các yếu tố để thúc đẩy in_front trướ c lá cờ xác định kết thúc của chuỗi sửa đổi. CV_BACK các yếu tố đượ c thêm vào cu ối của chuỗi CV_FRONT các yếu tố đượ c thêm vào đầu của chuỗi Hàm bổ sung thêm một số yếu tố để hai đầu của một chuỗi. Các yếu tố đượ c thêm vào trình t ự theo thứ tự giống như họ đượ c b ố trí trong mảng đầu vào, nhưng họ có thể rơ i vào khối th ứ tự khác nhau. cvSeqRemove Loại bỏ một phần tử từ giữa một chuỗi. void cvSeqRemove( CvSeq* seq, int index ); seq trình tự index Index của yếu tố loại bỏ Hàm loại bỏ các phần tử có chỉ số nhất định. Nếu chỉ số đượ c ra khỏi ph ạm vi Hàm báo cáo một lỗi. Một cố gắng để loại bỏ một phần tử từ một chuỗi sản phẩm nào là một trườ ng hợ p đặc biệt tình trạng này. Hàm loại bỏ một phần t ử bằng cách thay đổi các yếu tố trình tự giữa gần nhất kết thúc của trình tự và index-th vị trí , chưa kể sau này. cvSeqRemoveSlice Loại bỏ một phần trình tự. void cvSeqRemoveSlice( CvSeq* seq, CvSlice slice ); seq trình tự slice một phần của trình tự để loại bỏ Hàm loại bỏ một phần từ trình tự. cvSeqSearch Tìm kiếm một yếu tố trong một chuỗi. char* cvSeqSearch( CvSeq* seq, const void* elem, CvCmpFunc func, int is sorted, int* elem idx, void* userdata=NULL ); seq Trình tự Elem Các yếu tố để tìm kiếm func Hàm so sánh trả về giá trị, tích cực ho ặc tiêu cực không tùy thuộc vào mối quan hệ giữa các yếu tố (xem thêm cvSeqSort) is_sorted Cho dù đượ c sắp xếp theo trình tự hay không elem_idx tham số đầu ra, chỉ số của các yếu tố đượ c tìm thấy 82
userdata tham s ố ngườ i dùng thông qua Hàm compasion; giúp để tránh các biến toàn cầu trong một số trườ ng hợ p /* a < b ? -1 : a > b ? 1 : 0 */ typedef int (CV_CDECL* CvCmpFunc)(const void* a, const void* b, void* userdata); Hàm tìm kiếm cho các phần tử theo thứ tự. Nếu trình tự đượ c sắp xếp, một nhị phân O(log(N)) là đượ c sử dụng, nếu không, một tìm kiếm đơ n giản tuyến tính đượ c sử dụng. Nếu phần tử không tìm thấy, hàm trả về một con trỏ NULL và chỉ số đượ c thiết lập vớ i số lượ ng của các yếu tố chuỗi tìm kiếm tuyến tính đượ c sử dụng, hoặc chỉ số nhỏ nhất, seq(i)>elem. cvSeqSlice Làm cho một tiêu đề riêng biệt cho một phần trình tự. CvSeq* cvSeqSlice( const CvSeq* seq, CvSlice slice, CvMemStorage* storage=NULL, int copy data=0 ); seq trình tự slice Các phần của chuỗi đượ c trích xuất storage Các lưu trữ đích khối để giữ tiêu đề trình tự và các dữ liệu đượ c sao chép, nếu b ất k ỳ. Nếu nó là NULL, Hàm s ử dụng khối lưu trữ có chứa các chuỗi đầu vào. copy_data lá cờ cho biết có để sao chép các y ếu t ố của slice đượ c chiết xuất (copy_data != 0 ) hoặc không (copy_data = 0) Hàm này tạo ra một chuỗi đại diện cho slice quy định của chuỗi đầu vào. Các trình tự mớ i hoặc chia sẻ các yếu tố vớ i các trình tự ban đầu hoặc có bản sao riêng của mình. các yếu tố. Vì vậy, nếu một trong những nhu cầu để xử lý một phần của chuỗi nhưng các Hàm x ử lý không có một tham số slice, yêu cầu trình tự phụ có thể đượ c chiết xuất bằng cách sử dụng Hàm này. cvSeqSort Sắp xếp thứ tự các yếu tố bằng cách sử dụng Hàm so sánh quy định. void cvSeqSort( CvSeq* seq, CvCmpFunc func, void* userdata=NULL ); /* a < b ? -1 : a > b ? 1 : 0 */ typedef int (CV_CDECL* CvCmpFunc)(const void* a, const void* b, void* userdata); seq Các trình tự sắp xếp func Hàm so sánh r ằng trả về một giá trị, tiêu cực không, hay tích cực tùy thuộc vào mối quan hệ giữa các yếu tố (xem tuyên bố trên và ví dụ dướ i đây) - một Hàm tươ ng tự đượ c sử dụng bở i qsort từ C runline trừ thứ hai, userdata không s ử dụng userdata tham s ố ngườ i dùng thông qua Hàm compasion; giúp để tránh các biến toàn cầu trong một số trườ ng hợ p Hàm sắp xếp các chuỗi tại chỗ bằng cách sử dụng các tiêu chu ẩn quy định. Dướ i đây là một ví dụ về bằng cách sử dụng Hàm này: /* Sắp xếp 2d điểm theo thứ tự từ trái sang bên phải hàng đầu-to-bottom */ static int cmp_func( const void* _a, const void* _b, void* userdata ) { CvPoint* a = (CvPoint*)_a; CvPoint* b = (CvPoint*)_b; int y_diff = a->y - b->y; int x_diff = a->x - b->x; 83
return y_diff ? y_diff : x_diff; } ... CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* seq = cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage ); int i; for( i = 0; i < 10; i++ ) { CvPoint pt; pt.x = rand() % 1000; pt.y = rand() % 1000; cvSeqPush( seq, &pt ); } cvSeqSort( seq, cmp_func, 0 /* userdata is not used here */ ); /* print out the sorted sequence */ for( i = 0; i < seq->total; i++ ) { CvPoint* pt = (CvPoint*)cvSeqElem( seq, i ); printf( "(%d,%d)\n", pt->x, pt->y ); } cvReleaseMemStorage( &storage );
cvSetAdd Chiếm một nút trong thiết lập. int cvSetAdd( CvSet* setHeader, CvSetElem* elem=NULL, CvSetElem** inserted elem=NULL ); setHeader Set elem tham số đầu vào tùy chọn, một yếu tố đượ c chèn vào. Nếu không phải là NULL, Hàm sao chép dữ liệu các nút đượ c phân bổ (MSB của tr ườ ng s ố nguyên đầu tiên sẽ bị xóa sau khi sao chép). inserted_elem đầu ra tùy chọn, con trỏ đến các tế bào đượ c phân bổ Hàm phân bổ một nút mớ i, tùy chọn các bản sao dữ liệu yếu tố đầu vào, và trả về con trỏ và chỉ số nút. Các giá tr ị chỉ số đượ c lấy t ừ các bit thấp hơ n c ủa l ĩ nh vực cờ của nút. Hàm có O (1) phức tạp, tuy nhiên, có tồn tại một Hàm nhanh h ơ n cho phân bổ thiết lập các nút (xem cvSetNew). cvSetNew Thêm một yếu tố để thiết lập (biến thể nhanh chóng). CvSetElem* cvSetNew( CvSet* setHeader ); setHeader Set Hàm là một biến thể nhẹ nội tuyến của cvSetAdd. Nó chiếm một nút mớ i và trả về một con trỏ đến nó hơ n là một chỉ số. 84
cvSetRemove Loại bỏ một phần tử từ tập hợ p. void cvSetRemove( CvSet* setHeader, int index ); setHeader Set index chỉ số của phần tử loại bỏ Hàm loại bỏ một phần tử vớ i một chỉ số xác định từ thiết lập. Nếu nút vị trí ified không phải là chiếm đóng, Hàm không có gì. Hàm có O (1) ph ức tạp; như thế nào bao giờ hết, cvSetRemoveByPtr cung cấp một cách nhanh hơ n để loại b ỏ một yếu t ố thiết lập n ếu nó nằm đã. cvSetRemoveByPtr Loại bỏ một phần tử thiết lập dựa trên con trỏ của nó. void cvSetRemoveByPtr( CvSet* setHeader, void* elem ); setHeader Set elem Loại bỏ yếu tố Hàm là một biến thể nhẹ nội tuyến của cvSetRemove yêu c ầu một con trỏ yếu tố. Các Hàm không kiểm tra xem nút là chi ếm đóng hay không, ngườ i dùng nên chăm sóc đó. cvSetSeqBlockSize Thiết lập kích thướ c khối chuỗi. void cvSetSeqBlockSize( CvSeq* seq, int deltaElems ); seq trình tự deltaElems mong mu ốn trình tự kích thướ c khối cho các yếu tố Hàm này ảnh hưở ng đến cấp phát bộ nhớ granularity. Khi không gian trống trong chuỗi bộ đệm đã hết, Hàm phân bổ không gian cho các yếu t ố trình tự deltaElems. Nếu đây ngăn chặn ngay lập tức sau một giao trướ c đây, hai khối đượ c nối; khôn ngoan, một khối chuỗi mớ i đượ c tạo ra. Vì vậy, tham số lớ n hơ n, thấp hơ n chuỗi phân mảnh có thể có, nhưng không gian trong khối l ưu tr ữ là lãng phí. Khi trình t ự đượ c t ạo ra, deltaElems tham s ố đượ c thiết l ập để giá trị mặc định của khoảng 1K. Các Hàm có th ể đượ c gọi bất cứ lúc nào sau khi trình t ự đượ c tạo ra và ảnh hưở ng đến phân bổ tươ ng lai. Các Hàm có th ể thay đổi giá trị của tham số để đáp ứng hạn chế bộ nhớ lưu trữ thông qua. cvSetSeqReaderPos Di chuyển đầu đọc đến vị trí quy định. void cvSetSeqReaderPos( CvSeqReader* reader, int index, int is relative=0 ); reader Reader state index vị trí điểm đến. Nếu chế độ định vị đượ c sử dụng (xem các thông số tiếp theo), thực tế vị trí sẽ đượ c index mod reader->seq->total. 85
is_relative Nếu nó không phải là số không, sau đó chỉ số là tươ ng đối so vớ i vị trí hiện tại Hàm di chuyển vị trí đọc cho một vị trí tuyệt đối hay tươ ng đối so vớ i vị trí hiện tại. 1.4 Các hàm vẽ Hàm vẽ làm việc vớ i các ma tr ận / hình ảnh có chiều sâu tùy ý. Ranh giớ i của các hình d ạng có thể đượ c trả lại vớ i khử răng c ưa (thực hi ện chỉ dành cho hình ảnh 8-bit cho bây gi ờ ). Tất cả các Hàm bao gồm màu sắc tham số có sử dụng một giá trị rgb (có thể đượ c xây dựng vớ i CV_RGB v ĩ mô hoặc các Hàm cv) Cho hình ảnh màu sắc và độ sáng để màu xám. Đối vớ i hình ảnh màu sắc để kênh thông thườ ng là màu xanh, xanh, đỏ, đây là những gì cv, cv và cv mong đợ i, vì vậy nếu bạn tạo thành một màu sắc sử dụng cv, nó sẽ giống như: cvScalar (thành phần màu xanh da tr ờ i, xanh lá cây thành ph ần, đỏ thành phần, thành phần alpha]) Nếu b ạn đang sử dụng d ựng hình ảnh c ủa riêng bạn và các Hàm I / O, b ạn có thể sử dụng b ất cứ kênh nào đặt hàng, các Hàm vẽ quá trình mỗi kênh độc lập và không phụ thuộc vào kênh trật tự hoặc thậm chí trên không gian màu s ắc đượ c sử dụng. Toàn bộ hình ảnh có thể đượ c chuyển đổi từ BGR RGB hoặc một không gian màu khác nhau bằng cách sử dụng cv. Nếu một con số rút ra một phần hoặc hoàn toàn bên ngoài hình ảnh, Hàm vẽ clip nó. Ngoài ra, Hàm v ẽ có thể xử lý quy định tọa độ điểm ảnh vớ i độ chính xác sub-pixel, t ọa độ có thể đượ c thông qua như là số điểm cố định, mã hóa là s ố nguyên. Số lượ ng bit phân đoạn đượ c quy định bở i tham số thay đổi và các t ọa độ điểm th ực tế đượ c tính như Điểm (x, y) Point2f (x2-ca, y 2-ca). Tính n ăng này đặc biệt hiệu quả khi rendering antialiased hình d ạng. Ngoài ra, lưu ý rằng các Hàm không hỗ trợ alpha-minh bạch - khi các hình ảnh mục tiêu là 4channnel, sau đó màu sắc [3] chỉ đơ n giản là sao chép các điểm ảnh sơ n lại. Vì vậy, n ếu bạn muốn s ơ n bán trong su ốt hình dạng, bạn có thể vẽ trong một b ộ đệm riêng biệt và sau đó pha trộn nó vớ i các chính hình ảnh. cvCircle Vẽ một vòng tròn. void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int lineType=8, int shift=0 ); img Hình ảnh vòng tròn đượ c vẽ center trung tâm c ủa vòng tròn radius bán kính của vòng tròn color màu sắc vòng tròn thickness Độ dày của đề cươ ng vòng tròn nếu tích cực, nếu không điều này chỉ ra rằng một vòng tròn đầy đượ c rút ra linetype Loại ranh giớ i vòng tròn, xem mô tả dòng shift số bit phân đoạn trong các tọa độ trung tâm và giá tr ị bán kính Hàm vẽ một vòng tròn đơ n giản hoặc đầy vớ i một trung tâm và bán kính. cvClipLine Clip dòng chống lại các hình chữ nhật hình ảnh. 86
int cvClipLine( CvSize imgSize, CvPoint* pt1, CvPoint* pt2 ); imgSize Kích thướ c của hình ảnh pt1 đầu tiên kết thúc điểm của đoạn thẳng. Nó đượ c sửa đổi theo Hàm. pt2 thứ hai kết thúc điểm của đoạn thẳng. Nó đượ c sửa đổi theo Hàm. Hàm tính toán là một phần của đoạn đườ ng đó là hoàn toàn bên trong hình ảnh. Nó trả về 0 nếu đoạn đườ ng là hoàn toàn nằm ngoài hình ảnh và 1 khác cvDrawContours Vẽ phác thảo đườ ng viền bên trong một hình ảnh. void cvDrawContours( CvArr *img, CvSeq* contour, CvScalar external color, CvScalar hole color, int max level, int thickness=1, int lineType=8 ); img Hình ảnh các đườ ng viền đượ c rút ra. Như vớ i bất k ỳ Hàm vẽ khác, các đườ ng viền đượ c cắt bớ t vớ i thu nhập từ đầu. contour con trỏ đến các đườ ng viền đầu tiên external_color màu s ắc của các đườ ng viền bên ngoài hole_color Màu sắc của đườ ng nét nội bộ (lỗ) max_level mức độ tối đa cho đườ ng nét vẽ. Nếu 0, chỉ contour đượ c rút ra. Nếu 1, đườ ng viền và tất cả các đườ ng nét sau nó trên cùng m ột mức độ đượ c rút ra. Nếu 2, tất cả sau những đườ ng nét và tất cả các đườ ng nét một mức thấp hơ n các đườ ng viền đượ c rút ra, và vv. Nếu giá trị là tiêu cực, Hàm này không v ẽ các đườ ng viền sau đây sau khi contour rút nhưng những đườ ng nét con của contour tớ i các |max_level| - 1 level. thickness Độ dày của đườ ng dây các đườ ng viền đượ c rút ra. Nếu nó là tiêu c ực (Ví dụ, = CV_FILLED), nội thất đườ ng viền đượ c rút ra. lineType Loại của các đoạn đườ ng viền, xem mô tả Line Hàm vẽ phác thảo đườ ng viền trong hình ảnh nếu thickness>= 0 hoặc lấp đầy các khu vực giáp bở i những đườ ng nét nếu thickness<0. Ví dụ: Kết nối thành phần phát hiện thông qua các Hàm đườ ng viền #include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { IplImage* src; // the first command line parameter must be file name of binary // (black-n-white) image if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0) { IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 ); CvMemStorage* storage = cvCreateMemStorage(0); 87
CvSeq* contour = 0; cvThreshold( src, src, 1, 255, CV_THRESH_BINARY ); cvNamedWindow( "Source", 1 ); cvShowImage( "Source", src ); cvFindContours( src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); cvZero( dst ); for( ; contour != 0; contour = contour->h_next ) { CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 ); /* replace CV_FILLED with 1 to see the outlines */ cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8 ); } cvNamedWindow( "Components", 1 ); cvShowImage( "Components", dst ); cvWaitKey(0); } } cvEllipse Vẽ một vòng cung elip đơ n giản hoặc dày hoặc một lấp đầy khu vực hình elip. void cvEllipse( CvArr* img, CvPoint center, CvSize axes, double angle, double start angle, double end angle, CvScalar color, int thickness=1, int lineType=8, int shift=0 ); img Hình ảnh center trung tâm c ủa hình elip axes Chiều dài của trục ellipse angle góc xoay start_angle góc bắt đầu của vòng cung elip end_angle góc kết thúc của vòng cung elip. color màu sắc Ellipse thickness Độ dày của đề cươ ng hồ quang hình elip n ếu tích cực, nếu không điều này chỉ ra rằng một đầy khu vực hình elip đượ c rút ra linetype Loại ranh giớ i hình elip, xem mô tả dòng shift số bit phân đoạn trong các tọa độ trung tâm và trục giá trị Hàm vẽ một vòng cung elip đơ n giản hoặc dày hoặc điền vào một khu vực hình elip. Hồ quang đượ c gài bở i hình chữ nhật ROI. Một xấp xỉ tuyến tính piecewise đượ c sử dụng cho các vòng cung antialiased và vòng cung dày. T ất cả các góc đượ c đưa ra ở các mức độ. Những hình ảnh dướ i đây giải thích ý ngh ĩ a của các thông số. 88
Các thông số của Arc Elliptic
cvEllipseBox Vẽ một vòng cung elip đơ n giản hoặc dày hoặc điền vào một khu vực hình elip. void cvEllipseBox( CvArr* img, CvBox2D box, CvScalar color, int thickness=1, int lineType=8, int shift=0 ); img Hình ảnh box hộp kèm theo các hình elip v ẽ thickness Độ dày của ranh giớ i hình elip linetype Loại ranh giớ i hình elip, xem mô tả dòng shift số bit phân đoạn trong các tọa độ đỉnh hộp Hàm rút ra một phác thảo hình elip đơ n giản hoặc dày, hoặc điền vào một hình elip. Hàm cung cấp một cách thuận tiện để vẽ một hình elip xấp xỉ một số hình dạng, đó là những gì CamShift và FitEllipse làm. Các hình elip rút ra là c ắt bớ t thu nhập từ đầu hình chữ nhật. Một xấp xỉ tuyến tính piecewise đượ c sử dụng cho vòng cung antialiased và vòng cung dày. cvFillConvexPoly Điền vào các ô một đa giác lồi. void cvFillConvexPoly( CvArr* img, CvPoint* pts, int npts, CvScalar color, 89
int lineType=8, int shift=0 ); img Hình ảnh pts mảng của con trỏ đến một đa giác npts đỉnh Polygon truy cập color đa giác màu s ắc linetype Loại ranh giớ i đa giác, xem mô t ả dòng shift số bit phân đoạn trong các tọa độ đỉnh Hàm đầy bên trong của một đa giác lồi. Hàm này là nhanh hơ n nhiều so vớ i Hàm, nhiệm v ụ cvFillPoly và có thể làm không chỉ đa giác lồi nhưng bất k ỳ hình đa giác đơ n điệu, tức là, một đa giác có đườ ng viền cắt tất cả các đườ ng ngang (quét dòng) hai lần là nhiều nhất. cvFillPoly Điền vào các ô bên trong c ủa một đa giác. void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours, CvScalar color, int lineType=8, int shift=0 ); img Hình ảnh pts mảng của con trỏ cho các đa giác npts mảng của các quầy đỉnh đa giác contours Số đườ ng nét liên kết khu vực đầy color đa giác màu s ắc linetype Loại ranh giớ i đa giác, xem mô t ả dòng shift số bit phân đoạn trong các tọa độ đỉnh Hàm lấp đầy diện tích bị giớ i hạn bở i các đườ ng nét một số đa giác. Hàm đầy phức tạp khu vực, ví dụ, khu vực có lỗ, đườ ng viền tự giao lộ, và vv. cvGetTextSize Lấy chiều rộng và chiều cao của một chuỗi văn bản. void cvGetTextSize( const char* textString, const CvFont* font, CvSize* textSize, int* baseline ); font con trỏ đến cấu trúc phông chữ textString Chuỗi đầu vào textSize kích thướ c Resultant của chuỗi văn b ản. Chiều cao của văn bản không bao gồm chiều cao của phần dướ i đườ ng cơ sở . baseline y-phối hợ p của đườ ng cơ sở liên quan đến phía dướ i hầu hết các điểm văn bản Hàm tính toán kích th ướ c của hình chữ nhật để kèm theo một chuỗi v ăn bản khi một quy định phông chữ đượ c sử dụng. 90
cvInitFont Khở i tạo cấu trúc phông chữ. void cvInitFont( CvFont* font, int fontFace, double hscale, double vscale, double shear=0, int thickness=1, int lineType=8 ); font con trỏ cấu trúc chữ khở i tạo bở i Hàm fontFace nhận dạng tên chữ. Chỉ có một tập hợ p con của phông chữ Hershey http://sources.isc.org/utils/misc/hershey-font.txt đượ c hỗ trợ : CV_FONT_HERSHEY_SIMPLEX kích thướ c bình thườ ng phông chữ sans-serif CV_FONT_HERSHEY_PLAIN nhỏ kích thướ c phông chữ sans-serif CV_FONT_HERSHEY_DUPLEX bình thườ ng kích thướ c phông chữ sans-serif (phức tạp hơ n CV_FONT_HERSHEY_SIMPLEX) CV_FONT_HERSHEY_COMPLEX bình thườ ng kích thướ c phông chữ serif CV_FONT_HERSHEY_TRIPLEX bình thườ ng kích thướ c serif font (ph ức tạp hơ n CV_FONT_HERSHEY_COMPLEX) CV_FONT_HERSHEY_COMPLEX_SMALL phiên bản nhỏ hơ n của CV_FONT_HERSHEY_COMPLEX CV_FONT_HERSHEY_SCRIPT_SIMPLEX viết tay kiểu chữ CV_FONT_HERSHEY_SCRIPT_COMPLEX phức tạp hơ n biến thể của CV_FONT_HERSHEY_SCRIPT_SIMPLEX Tham số có thể đượ c ghép lại từ một trong những giá trị ở trên và một CV_FONT_ITALIC cờ , mà chỉ ra chữ in nghiêng hoặc xiên. hscale quy mô ngang. Nếu bằng 1.0f, các nhân vật có chiều rộng ban đầu tùy thuộc vào loại phông chữ. Nếu bằng 0.5f, các nhân vật nửa chiều rộng ban đầu. vscale dọc quy mô. Nếu bằng 1.0f, các nhân v ật có chiều cao ban đầu tùy thuộc vào phông chữ. Nếu bằng 0.5f, các nhân vật của một nửa chiều cao ban đầu. shear cắt tiếp tuyến của các sườ n núi nhân v ật liên quan đến đườ ng thẳng đứng. Một giá trị không có ngh ĩ a là một phông chữ không nghiêng, 1.0f có ngh ĩ a là khoảng một độ dốc 45 độ. thickness Độ dày của các nét văn bản lineType Loại của đột quỵ, xem mô tả Line Hàm khở i tạo cấu trúc chữ có thể đượ c thông qua vớ i Hàm vẽ chữ. cvInitLineIterator Khở i tạo biến lặp dòng. int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line iterator, int connectivity=8, int left to right=0 ); image Hình ảnh mẫu dòng từ 91
pt1 đầu tiên kết thúc điểm của đoạn thẳng pt2 điểm kết thúc thứ hai của đoạn đườ ng line_iterator trỏ cấu trúc dòng trạng thái lặp connectivity kết nối dòng quét, 4 hoặc 8. left_to_right(left_to_right = 0) sau đó dòng đượ c quét trong thứ tự quy định, từ pt1 đến pt2. Nếu (left_to_right!= 0) dòng đượ c quét từ trái điểm bên phải. Hàm khở i tạo biến lặp và trả về số lượ ng điểm ảnh giữa hai kết thúc điểm. Cả hai điểm này phải đượ c bên trong hình ảnh. Sau khi lặp đã đượ c khở i tạo, tất cả các điểm trên dòng raster kết nối hai điểm kết thúc có thể đượ c lấy ra bở i các cuộc gọi kế tiếp của CV_NEXT_LINE_POINT điểm. Các điểm trên đườ ng dây đượ c tính bằng cách sử dụng 4 kết nối hoặc kết nối 8-Bresen ham thuật toán. Ví dụ: Sử dụng dòng lặp để tính toán tổng các giá tr ị điểm ảnh dọc theo dòng màu. CvScalar sum_line_pixels( IplImage* image, CvPoint pt1, CvPoint pt2 ) { CvLineIterator iterator; int blue_sum = 0, green_sum = 0, red_sum = 0; int count = cvInitLineIterator( image, pt1, pt2, &iterator, 8, 0 ); for( int i = 0; i < count; i++ ){ blue_sum += iterator.ptr[0]; green_sum += iterator.ptr[1]; red_sum += iterator.ptr[2]; CV_NEXT_LINE_POINT(iterator); /* print the pixel coordinates: demonstrates how to calculate the coordinates */ { int offset, x, y; /* assume that ROI is not set, otherwise need to take it into account. */ offset = iterator.ptr - (uchar*)(image->imageData); y = offset/image->widthStep; x = (offset - y*image->widthStep)/(3*sizeof(uchar) /* size of pixel */); printf("(%d,%d)\n", x, y ); } } return cvScalar( blue_sum, green_sum, red_sum ); }
cvLine Vẽ một đoạn thẳng nối hai điểm. void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, 92
CvScalar color, int thickness=1, int lineType=8, int shift=0 ); img Hình ảnh pt1 điểm đầu tiên của đoạn đườ ng pt2 điểm thứ hai của đoạn đườ ng Màu đườ ng kẻ màu thickness độ dày dòng lineType Loại của dòng: 8 (hoặc bỏ qua) 8-kết nối dòng. 4 4 kết nối dòng. CV_AA antialiased. shift số bit phân đoạn tại điểm tọa độ Hàm rút ra đoạn đườ ng từ pt1 và pt2 điểm trong hình ảnh. Dòng đượ c cắt bớ t hình ảnh hoặc hình chữ nhật ROI. Đối vớ i dòng vớ i không antialiased s ố nguyên tọa độ 8-kết n ối ho ặc thuật toán Bresenham 4 k ết nối đượ c sử dụng. Đườ ng dây dày đượ c rút ra vớ i làm tròn kết thúc. Dòng Antialiased đượ c rút ra bằng cách sử dụng Gaussian lọc. Để xác định màu đườ ng, ngườ i sử dụng có thể sử dụng v ĩ mô CV_RGB( r, g, b ). cvPolyLine Rút ra các đa giác đơ n giản hay dày. void cvPolyLine( CvArr* img, CvPoint** pts, int* npts, int contours, int is closed, CvScalar color, int thickness=1, int lineType=8, int shift=0 ); pts mảng của con trỏ cho các đa giác npts mảng của các quầy đỉnh đa giác contours Số đườ ng nét liên kết khu vực đầy img Hình ảnh is_closed Chỉ xem các polylines và ph ải đượ c đóng lại. Nếu đóng cửa, Hàm rút ra đườ ng từ đỉnh cuối cùng của tất cả các đườ ng viền đỉnh đầu tiên. color Polyline color thickness Độ dày của các cạnh polyline lineType Loại của các đoạn đườ ng thẳng, xem mô tả Line shift số bit phân đoạn trong các tọa độ đỉnh Hàm rút ra một hoặc nhiều đườ ng cong đa giác. cvPutText Vẽ một chuỗi văn bản. void cvPutText( 93
CvArr* img, const char* text, CvPoint org, const CvFont* font, CvScalar color ); img Ảnh đầu vào text chuỗi để in org Tọa độ của góc dướ i bên trái của chữ cái đầu tiên font con trỏ đến cấu trúc phông chữ color màu chữ Hàm làm cho văn b ản trong hình ảnh vớ i phông chữ và màu sắc. V ăn b ản in cắt b ớ t b ở i hình chữ nhật ROI. Biểu t ượ ng không thuộc v ề phông chữ đượ c thay thế bằng biểu t ượ ng cho một hình chữ nhật. cvRectangle Vẽ một hình chữ nhật đơ n giản, dày, đầy. void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int lineType=8, int shift=0 ); img Hình ảnh pt1 Một trong các đỉnh của hình chữ nhật pt2 Đối diện hình chữ nhật đỉnh color màu nét v ẽ (RGB) hoặc độ sáng (hình ảnh màu xám ) thickness Độ dày của đườ ng tạo ra hình chữ nhật. Tiêu cực giá trị, ví dụ như, CV ĐIỀN, gây ra các Hàm để vẽ một hình chữ nhật đầy. lineType Loại của các dòng, xem Line thay đổi số bit phân đoạn tại điểm tọa độ Hàm vẽ một hình chữ nhật vớ i hai góc đối diện pt1 và pt2. CV_RGB Xây dựng một giá trị màu. #define CV RGB( r, g, b ) cvScalar( (b), (g), (r) ) red đỏ thành phần grn xanh thành phần blu xanh thành phần
1.5 XML/YAML Persistence CvFileStorage Tập tin lưu trữ. typedef struct CvFileStorage { 94
// các trườ ng ẩn } CvFileStorage; Cấu trúc CvFileStorage là m ột "h ộp đen" đại di ện c ủa các tập tin lưu tr ữ có liên quan vớ i m ột tập tin trên đĩ a. M ột số Hàm đượ c mô tả dướ i đây CvFileStorage nh ư là đầu vào và cho phép theuser lưu ho ặc t ải các bộ sưu t ập th ứ bậc bao gồm các giá trị vô h ướ ng, tiêu chuẩn CXCore đối tượ ng (chẳng hạn như ma trận, trình tự, đồ thị), và các đối tượ ng ngườ i dùng định ngh ĩ a. CXCore có thể đọc và ghi dữ liệu trong XML (http://www.w3c.org/XML) hoặc YAML (http://www.yaml.org) định dạng. Dướ i đây là một ví dụ về 3×3 dấu chấm động nhận dạng ma trận A, đượ c lưu trữ trong XML và YAML các t ập tin bằng cách sử dụng các Hàm CXCore: XML: 3 3 f 1. 0. 0. 0. 1. 0. 0. 0. 1. YAML: %YAML:1.0 A: !!opencv-matrix rows: 3 cols: 3 dt: f data: [ 1., 0., 0., 0., 1., 0., 0., 0., 1.] Vì nó có thể đượ c nhìn thấy từ các ví dụ, XML sử dụng các thẻ lồng nhau để đại di ện cho hệ thống phân cấp, trong khi YAML sử dụng thụt đầu dòng cho mục đích đó (t ươ ng tự như ngôn ngữ lập trình Python). Các Hàm CXCore tươ ng tự có thể đọc và ghi dữ liệu trong cả hai định dạng, định dạng đặc biệt là xác định bở i phần mở rộng của tập tin mở , xml cho các tập tin XML. yml hoặc yaml YAML.. CvFileNode Node lưu trữ tập tin. /* Loại nút tập tin */ #define CV_NODE_NONE 0 #define CV_NODE_INT 1 #define CV_NODE_INTEGER CV_NODE_INT #define CV_NODE_REAL 2 #define CV_NODE_FLOAT CV_NODE_REAL #define CV_NODE_STR 3 #define CV_NODE_STRING CV_NODE_STR #define CV_NODE_REF 4 /* không đượ c sử dụng */ #define CV_NODE_SEQ 5 #define CV_NODE_MAP 6 #define CV_NODE_TYPE_MASK 7 95
/* Cờ tùy chọn nào */ #define CV_NODE_USER 16 #define CV_NODE_EMPTY 32 #define CV_NODE_NAMED 64 #define CV_NODE_TYPE(tag) ((tag) & CV_NODE_TYPE_MASK) #define CV_NODE_IS_INT(tag) (CV_NODE_TYPE(tag) == CV_NODE_INT) #define CV_NODE_IS_REAL(tag) (CV_NODE_TYPE(tag) == CV_NODE_REAL) #define CV_NODE_IS_STRING(tag) (CV_NODE_TYPE(tag) == CV_NODE_STRING) #define CV_NODE_IS_SEQ(tag) (CV_NODE_TYPE(tag) == CV_NODE_SEQ) #define CV_NODE_IS_MAP(tag) (CV_NODE_TYPE(tag) == CV_NODE_MAP) #define CV_NODE_IS_COLLECTION(tag) (CV_NODE_TYPE(tag) >= CV_NODE_SEQ) #define CV_NODE_IS_FLOW(tag) (((tag) & CV_NODE_FLOW) != 0) #define CV_NODE_IS_EMPTY(tag) (((tag) & CV_NODE_EMPTY) != 0) #define CV_NODE_IS_USER(tag) (((tag) & CV_NODE_USER) != 0) #define CV_NODE_HAS_NAME(tag) (((tag) & CV_NODE_NAMED) != 0) #define CV_NODE_SEQ_SIMPLE 256 #define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0) typedef struct CvString { int len; char* ptr; } CvString; /* Tất cả các phím (tên) của các yếu tố trong lưu trữ tập tin readed đượ c lưu trữ trong băm để tăng tốc độ hoạt động tra cứu */ typedef struct CvStringHashNode { unsigned hashval; CvString str; struct CvStringHashNode* next; } CvStringHashNode; /* Yếu tố cơ bản của tập tin lưu trữ - vô hướ ng hoặc bộ sưu tập */ typedef struct CvFileNode { int tag; struct CvTypeInfo* info; /* loại thông tin (Chỉ for đối tượ ng ngườ i dùng đượ c xác định, for đối vớ i những ngườ i khác nó là 0) */ union { double f; /* vô hướ ng nổi điểm số */ int i; /* Vô hướ ng số lượ ng số nguyên */ CvString str; /* chuỗi văn bản */ CvSeq * seq; /* chuỗi (ra lệnh cho bộ sưu tập của các nút tập tin) */ struct CvMap * map; /* bản đồ (bộ sưu tập của các nút tập tin có tên) */ } data; 96
} CvFileNode; Cấu trúc này ch ỉ đượ c sử dụng để lấy dữ liệu từ tập tin lưu trữ (tức là, cho các d ữ liệu tải từ tập tin). Khi dữ liệu đượ c ghi vào một tập tin, nó đượ c thực hiện tuần tự, vớ i đệm tối thiểu. Không có dữ liệu đượ c lưu trữ trong lưu trữ tập tin. Ngượ c l ại, khi dữ liệu đượ c đọc t ừ một t ập tin, toàn bộ tập tin đượ c phân tích cú pháp và đại diện trong bộ nhớ như một cây. Mỗi nút của cây đượ c đại diện bở i CvFileNode. Loại N nút tập tin có thể đượ c lấy như CV_NODE_TYPE(N->tag). Một số các nút tập tin (lá) là vô hướ ng: các chuỗi văn bản, số nguyên, số dấu chấm động. Các nút tập tin khác là các b ộ sưu tập của các nút tập tin, có thể đượ c vô hướ ng hoặc các bộ sưu t ập l ần l ượ t c ủa h ọ. Có hai loại b ộ sưu tập: trình tự và b ản đồ (chúng tôi sử dụng ký hiệu YAML, tuy nhiên, điều này cũng đúng cho dòng XML). Trình tự (không trộn chúng vớ i CvSeq) đượ c s ắp xếp bộ sưu t ập c ủa các nút tập tin giấu tên, bản đồ là không có thứ tự các bộ sưu tập của tên là các nút t ập tin. Vì vậy, các yếu tố của chuỗi đượ c truy cập bở i chỉ số (GetSeqElem), trong khi các yếu tố của bản đồ đượ c truy cập bở i tên (GetFileNodeByName). B ảng dướ i đây mô tả các các loại khác nhau của các nút tập tin: /////////// table Type CV_NODE_TYPE(node->tag) Value Integer CV_NODE_INT node->data.i Floating-point CV_NODE_INT node->data.f Text string CV NODE STR node->data.str.ptr Trình tự CV NODE SEQ node->data.seq Map CV NODE MAP node->data.map(xem dướ i đây) Không cần phải truy cập vào các l ĩ nh vực map trực tiếp (bằng cách này, CvMap là một cấu trúc ẩn). Các yếu tố của bản đồ có thể đượ c lấy ra vớ i Hàm GetFileNodeByName mất một con trỏ đến nút tập tin "bản đồ" . Một đối tượ ng ngườ i dùng (tùy chỉnh) là một thể hiện hoặc là một trong các loại CxCore tiêu chuẩn, chẳng hạn như CvMat, CvSeq vv, hoặc bất kỳ loại hình đăng ký vớ i RegisterTypeInfo. Một đối t ượ ng ban đầu là đại di ện. b ực b ội trong một t ập tin như là một b ản đồ (như thể hiện trong XML và các t ập tin ví dụ YAML ở trên) sau khi lưu trữ tập tin đã đượ c mở ra và phân tích cú pháp. Sau đó đối tượ ng có thể đượ c giải mã (chuyển đổi sang đại diện bản địa) theo yêu cầu - khi ngườ i dùng gọi các Hàm Read ho ặc ReadByName. CvAttrList Danh sách các thu ộc tính. typedef struct CvAttrList { const char** attr; /* m ảng NULL-chấm dứt (thuộc tính \ _name, thu ộc tính \ _value) cặp */ struct CvAttrList tiếp theo; / * con trỏ đến đoạn tiếp theo của danh sách các thu ộc tính * / } 97
CvAttrList; /* Khở i tạo cấu trúc CvAttrList */ inline CvAttrList cvAttrList( const char** attr=NULL, CvAttrList* next=NULL ); /* Trả về thuộc tính giá trị hoặc 0 (NULL) nếu không có thuộc tính như vậy */ const char* cvAttrValue( const CvAttrList* attr, const char* attr\_name ); Trong việc thực hiện hiện tại, thuộc tính đượ c sử dụng để vượ t qua các thông s ố khi viết ngườ i dùng đối t ượ ng (xem Write). Thuộc tính XML bên trong các th ẻ không đượ c h ỗ trợ , ngoài các lo ại đối tượ ng đặc điểm kỹ thuật (type_id thuộc tính). CvTypeInfo Điền thông tin. typedef int (CV_CDECL *CvIsInstanceFunc)( const void* structPtr ); typedef void (CV_CDECL *CvReleaseFunc)( void** structDblPtr ); typedef void* (CV_CDECL *CvReadFunc)( CvFileStorage* storage, CvFileNode* node ); typedef void (CV_CDECL *CvWriteFunc)( CvFileStorage* storage, const char* name, const void* structPtr, CvAttrList attributes ); typedef void* (CV_CDECL *CvCloneFunc)( const void* structPtr ); typedef struct CvTypeInfo { int flags; /* không đượ c sử dụng */ int header_size;; /* sizeof (CvTypeInfo) */ struct CvTypeInfo* prev; /* lo ại trướ c đó đã đăng ký trong danh sách */ struct CvTypeInfo* next; /* ti ếp theo đăng ký loại trong danh sách */ const char* type_name; /* tên lo ại, đượ c viết để lưu trữ tập tin */ /* Phươ ng pháp */ CvIsInstanceFunc is_instance; /* ki ểm tra nếu đối tượ ng thông qua thuộc loại */ CvReleaseFunc release; /* đối tượ ng phát hành (bộ nhớ ...) */ CvReadFunc read; /* đối tượ ng đọc từ tập tin lưu trữ */ CvWriteFunc write; /* vi ết đối tượ ng để lưu trữ tập tin */ CvCloneFunc clone; /* t ạo ra một bản sao của đối tượ ng */ } CvTypeInfo; CvTypeInfo cấu trúc chứa thông tin về một trong những tiêu chuẩn hoặc ngườ i dùng định ngh ĩ a các loại. Trườ ng hợ p của loại có thể hoặc không có thể chứa một con trỏ vào CvTypeInfo tươ ng ứng c ấu trúc. Trong bất k ỳ trườ ng hợ p nào, có một cách để tìm thấy những cấu trúc thông tin lo ại cho một đối tượ ng bằng cách sử dụng Typeof Hàm. Aternatively, thông tin loại có thể đượ c tìm thấy theo tên loại sử dụng FindType, đượ c sử dụng khi một đối t ượ ng đượ c đọc từ tập tin lưu trữ. Ngườ i dùng có thể đăng ký một loại mớ i vớ i RegisterType rằng cho biết thêm các c ấu trúc thông tin đánh vào đầu c ủa danh sách lo ại. Vì vậy, nó có thể tạo ra loại chuyên ngành t ừ các loại tiêu chuẩn chung và ghi đè lên các phươ ng pháp cơ bản. cvClone 98
Làm cho một bản sao của một đối tượ ng. void* cvClone( const void* structPtr ); structPtr Các đối tượ ng nhân bản Hàm tìm thấy các loại của một đối tượ ng nhất định và các cu ộc gọi clone vớ i các đối tượ ng đượ c thông qua. cvEndWriteStruct Kết thúc bằng văn bản của một cấu trúc. void cvEndWriteStruct(CvFileStorage* fs); fs tập tin lưu trữ Hàm hoàn thành c ấu trúc hiện bằng văn bản. cvFindType Tìm thấy một loại theo tên của nó. CvTypeInfo* cvFindType(const char* typeName); typeName Tên Lo ại Hàm tìm thấy một loại đăng ký theo tên của nó. Nó trả về NULL nếu không có loại vớ i quy định tên. cvFirstType Trả về khở i đầu của một danh sách loại. CvTypeInfo* cvFirstType(void); Hàm trả về các loại đầu tiên trong danh sách các lo ại đăng ký. Chuyển hướ ng thông qua danh sách có thể đượ c thực hiện thông qua prev và các tr ườ ng next của cấu trúc CvTypeInfo. cvGetFileNode Tìm một nút trong một bản đồ hoặc lưu trữ tập tin. CvFileNode* cvGetFileNode( CvFileStorage* fs, CvFileNode* map, const CvStringHashNode* key, int createMissing=0 ); fs tập tin lưu trữ map Bản đồ cha. Nếu nó là NULL, Hàm tìm kiếm một nút cấp cao nhất. Nếu cả hai map và key là NULLs, hàm trả về nút tập tin gốc - một bản đồ có chứa các nút cấp cao nhất. key quan trọng duy nhất con trỏ đến các tên nút, lấy vớ i GetHashedKey createMissing Flag xác định liệu một nút vắng mặt nên đượ c thêm vào bản đồ Hàm tìm thấy một nút tập tin. Nó là một phiên bản nhanh hơ n của GetFileNodeByName (xem GetHashedKey). Ngoài ra, các Hàm có th ể chèn một nút mớ i, nếu nó không có trong bản đồ. cvGetFileNodeByName Tìm một nút trong một bản đồ hoặc lưu trữ tập tin. CvFileNode* cvGetFileNodeByName( const CvFileStorage* fs, const CvFileNode* map, const char* name); 99
fs tập tin lưu trữ map Bản đồ cha. Nếu nó là NULL, tìm ki ếm Hàm trong tất c ả các nút cấp cao nhất (streams) bắt đầu vớ i một trong những ngườ i đầu tiên. name tên tập tin nút Hàm tìm thấy một nút tập tin theo name. Nút ho ặc là tìm kiếm bản đồ, nếu con trỏ NULL, các nút lưu trữ tập tin giữa các cấp cao nhất. Sử dụng Hàm này cho các b ản đồ và GetSeqElem (Hay trình tự đọc) cho các trình tự, nó có thể để nagivate thông qua các t ập tin lưu trữ. Để tăng tốc độ truy vấn lập nhiều cho một phím nào đó (ví dụ, trong trườ ng hợ p của một mảng của cấu trúc), ngườ i ta có thể sử dụng một sự kết hợ p của GetHashedKey và GetFileNode. cvGetFileNodeName Trả về tên của một nút tập tin. const char* cvGetFileNodeName( const CvFileNode* node ); node file nút Hàm trả về tên của m ột nút tập tin hoặc NULL, nếu nút tập tin không có tên ho ặc nếu node là NULL. cvGetHashedKey Trả về một con trỏ duy nhất cho một tên cho. CvStringHashNode* cvGetHashedKey( CvFileStorage* fs, const char* name, int len=-1, int createMissing=0 ); fs tập tin lưu trữ name nút tên Literal len Chiều dài của tên (nếu nó đượ c biết đến apriori), hoặc -1 nếu nó cần phải đượ c tính toán createMissing Flag ch ỉ định, cho dù một khoá vắng mặt nên đượ c bổ sung vào bảng băm Hàm trả về một con trỏ duy nhất cho mỗi tên file nút c ụ thể. Con trỏ này có thể đượ c sau đó thông qua Hàm GetFileNode nhanh hơ n GetFileNodeByName bở i vì nó so sánh các chu ỗi văn bản bằng cách so sánh con tr ỏ chứ không phải là nội dung của chuỗi. Hãy xem xét ví d ụ sau đây m ột loạt các điểm đượ c mã hóa như là một chuỗi nhập c ảnh-2 bản đồ: %YAML:1.0 points: - { x: 10, y: 10 } - { x: 20, y: 20 } - { x: 30, y: 30 } # ... Sau đó, nó có thể để có đượ c băm "x" và "y" con trỏ để tăng tốc độ giải mã của các điểm. #include "cxcore.h" int main( int argc, char** argv ) { CvFileStorage* fs = cvOpenFileStorage( "points.yml", 0, CV\_STORAGE\_READ ) CvStringHashNode* x\_key = cvGetHashedNode( fs, "x", -1, 1 ); CvStringHashNode* y\_key = cvGetHashedNode( fs, "y", -1, 1 ); CvFileNode* points = cvGetFileNodeByName( fs, 0, "points" ); 100
if( CV\_NODE\_IS\_SEQ(points->tag) ) { CvSeq* seq = points->data.seq; int i, total = seq->total; CvSeqReader reader; cvStartReadSeq( seq, &reader, 0 ); for( i = 0; i < total; i++ ) { CvFileNode* pt = (CvFileNode*)reader.ptr; #if 1 /* nhanh hơ n phiên bản */ CvFileNode* xnode = cvGetFileNode( fs, pt, x\_key, 0 ); CvFileNode* ynode = cvGetFileNode( fs, pt, y\_key, 0 ); assert( xnode && CV\_NODE\_IS\_INT(xnode->tag) && ynode && CV\_NODE\_IS\_INT(ynode->tag)); int x = xnode->data.i; // or x = cvReadInt( xnode, 0 ); int y = ynode->data.i; // or y = cvReadInt( ynode, 0 ); # Elif 1 / * chậm biến thể, không sử dụng x \ _key & y \ _key _ke y * / CvFileNode* xnode = cvGetFileNodeByName( fs, pt, "x" ); CvFileNode* ynode = cvGetFileNodeByName( fs, pt, "y" " y" ); assert( xnode && CV\_NODE\_IS\_INT(xnode->tag) && ynode && CV\_NODE\_IS\_INT(ynode->tag)); int x = xnode->data.i; // or x = cvReadInt( xnode, 0 ); int y = ynode->data.i; // or y = cvReadInt( ynode, 0 ); #else /* the slowest yet the easiest to use variant */ int x = cvReadIntByName( fs, pt, "x", 0 /* default value */ ); int y = cvReadIntByName( fs, pt, "y", 0 /* default value */ ); #endif CV\_NEXT\_SEQ\_ELEM( seq->elem\_size, reader ); printf("%d: (%d, %d)\n", i, x, y ); } } cvReleaseFileStorage( cvReleaseFileStorage( &fs ); return 0; } Xin lưu ý rằng bất cứ phươ ng ng pháp truy cập vào một bản đồ mà bạn đang sử dụng, nó vẫn còn chậm hơ n nhiều hơ n bằng cách sử dụng các trình t ự đơ n giản, ví dụ, trong ví dụ trên, nó là hi ệu quả hơ n để mã hóa các điểm như cặp số nguyên trong một chuỗi số duy nhất. cvGetRootFileNode Lấy một trong các nút c ấp cao nhất của tập tin lưu trữ. CvFileNode* cvGetRootFileNode( const CvFileStorage* fs, int stream index=0 ); fs tập tin lưu trữ stream_index Zero-index c ủa dòng suối. Xem StartNextStream. Trong h ầu hết trườ ng ng hợ p, p, có 101
chỉ có một dòng trong tập tin, tuy nhiên, có thể có nhiều. Hàm trả về một trong các nút t ập tin trên cấp. Các nút cấp cao nhất không có tên, chúng t ươ ng ng ứng vớ i các dòng đượ c lưu trữ sau khi một trong lưu trữ tập tin. Nếu chỉ số là ra khỏi phạm vi, Hàm trả về một con trỏ NULL, do đó t ất c ả các nút cấp cao nhất có thể đượ c l ặp các cuộc gọi tiếp theo Hàm vớ i stream_index=0,1,..., cho đến khi con trỏ NULL đượ c trả về. Hàm này có thể đượ c sử dụng như một cơ sở cho đệ quy traversal lưu trữ tập tin. cvLoad Nạp một đối tượ ng ng từ một tập tin. void* cvLoad( const char* filename, CvMemStorage* storage=NULL, const char* name=NULL, const char** realName=NULL ); filename tên t ập tin storage Bộ nhớ lưu tr ữ cho các c ấu trúc năng động, chẳng h ạn nh ư CvSeq hoặc CvGraph. Nó không đượ c sử dụng cho ma trận, hình ảnh. name tên đối tượ ng ng tùy chọn. Nếu nó là NULL, đối tượ ng ng cấp cao đầu tiên trong lưu trữ sẽ đượ c nạp. realName tham s ố tùy chọn đầu ra sẽ chứa tên của đối tượ ng ng đượ c tải (hữu ích nếu name = NULL) Hàm tải một đối tượ ng ng từ một tập tin. Nó cung cấp một giao diện đơ n giản để cvRead. Sau khi đối t ượ ng ng đượ c t ải, l ưu trữ tập tin đượ c đóng cửa và tất c ả các bộ đệm t ạm th ờ i đượ c xóa. Vì vậy, để tải m ột c ấu trúc năng động, chẳng hạn nh ư là một chuỗi, đườ ng ng viền, hoặc bi ểu đồ, ta nên thông qua một bộ nhớ hợ p lệ địa điểm lưu trữ Hàm. cvOpenFileStorage Mở tập tin lưu trữ cho việc đọc hoặc ghi dữ liệu. CvFileStorage* cvOpenFileStorage( const char* filename, CvMemStorage* memstorage, int flags); filename Tên c ủa tập tin kết hợ p vớ i lưu trữ memstorage b ộ nhớ lưu tr ữ đượ c s ử dụng cho dữ liệu tạm thờ i và để lưu tr ữ các cấu trúc năng động, như như CvSeq hoặc CvGraph. Nếu nó là NULL, một b ộ nhớ lưu tr ữ tạm thờ i đượ c t ạo ra và sử dụng. flags có thể là một trong những điều sau đây: CV_STORAGE_READ lưu trữ đượ c mở ra để đọc CV_STORAGE_WRITE lưu trữ đượ c mở ra để viết Hàm mở tập tin lưu trữ cho việc đọc hoặc ghi dữ liệu. Trong trườ ng ng hợ p thứ hai, một tập tin mớ i tạo ra hoặc một tập tin hiện đượ c viết lại. Các loại tập tin đượ c đọc hoặc bằng văn bản đượ c xác định b ở i tên t ập tin mở rộng: xml cho XML và yml hoặc yaml cho YAML. Hàm tr ả về một con trỏ cấu trúc CvFileStorage. cvRead Một đối tượ ng ng giải mã và trả về một con trỏ đến nó. void* cvRead( 102
CvFileStorage* fs, CvFileNode* node, CvAttrList* attributes=NULL ); fs tập tin lưu trữ node nút đối tượ ng ng gốc attributes biểu tượ ng ng thông số chưa sử dụng Các Hàm giải mã ngườ i sử dụng một đối tượ ng ng (tạo ra một đối tượ ng ng trong một đại diện có nguồn gốc từ tập tin lưu trữ cây con) và trả về nó. Các đối tượ ng ng đượ c giải mã phải là một thể hiện của một loại đăng ký hỗ trợ phươ ng ng pháp read (xem CvTypeInfo). Các lo ại đối tượ ng ng đượ c xác định bở i loại tên đượ c mã hóa trong t ập tin. Nếu đối tượ ng ng là một cấu trúc năng động, nó đượ c tạo ra hoặc trong bộ nhớ lưu trữ và thông qua để OpenFileStorage hoặc, nếu một con trỏ NULL đượ c thông qua, trong tạm thờ i bộ nhớ lưu trữ, đượ c phát hành khi ReleaseFileStorage đượ c gọi. Nếu không, nếu đối tượ ng ng không phải là một cấu trúc năng động, nó đượ c tạo ra trong bộ nhớ và sẽ đượ c phát hành vớ i một Hàm chuyên ngành ho ặc bằng cách sử dụng thông cáo Release. cvReadByName Tìm thấy một đối tượ ng ng tên và giải mã nó. void* cvReadByName( CvFileStorage* fs, const CvFileNode* map, const char* name, CvAttrList* attributes=NULL ); fs tập tin lưu trữ map Bản đồ cha mẹ. Nếu nó là NULL, Hàm tìm ki ếm một nút cấp cao nhất. name tên nút attributes biểu tượ ng ng thông số chưa sử dụng Các Hàm đượ c một sự chồng chất đơ n giản của GetFileNodeByName và Read. cvReadInt Lấy một giá trị số nguyên từ một nút tập tin. int cvReadInt( const CvFileNode* node, int defaultValue=0 ); node file nút defaultValue Các giá tr ị đượ c trả về nếu node là NULL Hàm trả về một số nguyên đượ c đại diện bở i các nút tập tin. Nếu nút tập tin là NULL, defaultValue đượ c trả lại (do đó, nó là thuận tiện để gọi đúng Hàm sau khi GetFileNode mà không cần kiểm tra một con trỏ NULL). Nếu nút tập tin có ki ểu CV_NODE_INT, sau đó node>data.i đượ c tr ả về. N ếu nút tập tin có lo ại CV_NODE_REAL, sau đó node->data.f là chuy ển đổi thành một số nguyên và trả về. Nếu không kết quả là không xác định. cvReadIntByName Tìm một nút tập tin và tr ả về giá trị của nó. int cvReadIntByName( const CvFileStorage* fs, const CvFileNode* map, 103
const char* name, int defaultValue=0 ); fs tập tin lưu trữ map Bản đồ cha mẹ. Nếu nó là NULL, Hàm tìm kiếm một nút cấp cao nhất. name tên nút defaultValue Các giá tr ị đượ c trả về nếu các nút tập tin là không tìm thấy Hàm là một sự chồng chất đơ n giản GetFileNodeByName và ReadInt. cvReadRawData Đọc số lượ ng nhiều. void cvReadRawData( const CvFileStorage* fs, const CvFileNode* src, void* dst, const char* dt); fs tập tin lưu trữ src nút tập tin (một chuỗi) để đọc số từ dst con trỏ đến mảng đích dt Đặc điểm kỹ thuật của mỗi phần tử mảng. Nó có định dạng tươ ng tự như trong WriteRawData. Hàm đọc các yếu tố từ một nút tập tin đại diện cho một chuỗi vô hướ ng. cvReadRawDataSlice Khở i đầu đọc file dãy nút. void cvReadRawDataSlice( const CvFileStorage* fs, CvSeqReader* reader, int count, void* dst, const char* dt ); fs tập tin lưu trữ reader trình tự đọc. Khở i tạo nó StartReadRawData. count số lượ ng các yếu tố để đọc dst con trỏ đến mảng đích dt Đặc điểm kỹ thuật của mỗi phần tử mảng. Nó có định dạng tươ ng tự như trong WriteRawData. Hàm đọc một hoặc nhiều yếu tố từ nút tập tin, đại diện cho một chuỗi, vớ i một ngườ i dùng chỉ định mảng. Tổng số các yếu tố trình tự đọc là một sản phẩm của total và số lượ ng các thành phần trong mỗi phần t ử mảng. Ví dụ, nếu dt = 2if, Hàm sẽ đọc total × 3 yếu tố chuỗi. Như vớ i bất k ỳ chuỗi, m ột s ố phần của chuỗi nút tập tin có thể bị bỏ qua hoặc đọc nhiều l ần bằng cách tái định vị cho ngườ i đọc sử dụng SetSeqReaderPos. cvReadReal Lấy một giá trị nổi-điểm từ một nút tập tin. double cvReadReal( const CvFileNode* node, double defaultValue=0. ); 104
node file nút defaultValue Các giá tr ị đượ c trả về nếu node là NULL Hàm trả về một giá trị nổi điểm đó đượ c đại diện b ở i các nút tập tin. Nếu nút tập tin NULL, defaultValue đượ c trả lại (do đó, nó là thuận tiện để gọi Hàm ngay sau khi GetFileNode mà không cần kiểm tra m ột con trỏ NULL). Nếu nút tập tin có kiểu CV_NODE_REAL, sau đó node->data.f đượ c trả về. Nếu nút tập tin có kiểu CV_NODE_INT, sau đó node->data.f là chuyển đổi dấu chấm động và quay trở lại. Nếu không kết quả là không xác định. cvReadRealByName Tìm một nút tập tin và trả về giá trị của nó. double cvReadRealByName( const CvFileStorage* fs, const CvFileNode* map, const char* name, double defaultValue=0.); fs tập tin lưu trữ map Bản đồ cha mẹ. Nếu nó là NULL, Hàm tìm kiếm một nút cấp cao nhất. name tên nút defaultValue Các giá tr ị đượ c trả về nếu các nút tập tin là không tìm thấy Hàm là một sự chồng chất đơ n giản GetFileNodeByName và ReadReal. cvReadString Lấy một chuỗi văn bản từ một nút tập tin. const char* cvReadString( const CvFileNode* node, const char* defaultValue=NULL ); node file nút defaultValue Các giá tr ị đượ c trả về nếu node là NULL Hàm trả về một chuỗi văn bản đượ c đại diện bở i các nút t ập tin. Nếu nút tập tin NULL, defaultValue đượ c trả lại (do đó, nó là thuận tiện để gọi Hàm ngay sau khi GetFileNode mà không cần kiểm tra một con trỏ NULL). Nếu nút tập tin có kiểu CV_NODE_STR, sau đó node->data.str.ptr đượ c trả về. Nếu không kết quả là không xác định. cvReadStringByName Tìm một nút tập tin theo tên của nó và trả về giá trị của nó. const char* cvReadStringByName( const CvFileStorage* fs, const CvFileNode* map, const char* name, const char* defaultValue=NULL ); fs tập tin lưu trữ map Bản đồ cha mẹ. Nếu nó là NULL, Hàm tìm kiếm một nút cấp cao nhất. name tên nút defaultValue Các giá tr ị đượ c trả về nếu các nút tập tin là không tìm thấy Hàm là một sự chồng chất đơ n giản GetFileNodeByName và ReadString. cvRegisterType 105
Đăng ký một loại mớ i. void cvRegisterType(const CvTypeInfo* info); info Loại thông tin cấu trúc Hàm đăng ký một lo ại m ớ i, đượ c mô tả bở i info. Hàm tạo ra một bản sao của c ấu trúc, vì vậy ngườ i dùng nên xóa nó sau khi g ọi Hàm.
cvRelease Phát hành một đối tượ ng. void cvRelease( void** structPtr ); structPtr đôi con trỏ đến đối tượ ng Hàm tìm thấy các loại của một đối tượ ng nhất định và các cuộc gọi phát hành vớ i hai con trỏ. cvReleaseFileStorage Phiên bản lưu trữ tập tin. void cvReleaseFileStorage(CvFileStorage** fs); fs đôi con trỏ để lưu trữ tập tin phát hành Hàm đóng cửa các tập tin liên quan đến lưu trữ và phát hành tất cả các tạm thờ i cấu tures. Nó phải đượ c gọi sau khi tất cả các hoạt động I / O vớ i lưu trữ đã kết thúc. cvSave Lưu một đối tượ ng vào một tập tin. void cvSave( const char* filename, const void* structPtr, const char* name=NULL, const char* comment=NULL, CvAttrList attributes=cvAttrList()); filename tên t ập tin structPtr đối tượ ng để tiết kiệm name tên đối tượ ng tùy chọn. Nếu nó là NULL, tên s ẽ đượ c hình thành từ filename comment tùy chọn để đưa vào đầu của tập tin attributes thuộc tính tùy chọn đượ c thông qua để Write Hàm tiết kiệm một đối tượ ng vào một tập tin. Nó cung cấp một giao diện đơ n giản để viết. cvStartNextStream Bắt đầu dòng tiếp theo. void cvStartNextStream(CvFileStorage* fs); fs tập tin lưu trữ Hàm bắt đầu các dòng tiếp theo trong tập tin lưu trữ. Cả hai YAML và nhiều hỗ trợ XML "streams". Điều này rất hữu ích cho concatenating các t ập tin hoặc khôi phục các quá trình viết. cvStartReadRawData Khở i tạo các nút đọc tập tin trình tự. void cvStartReadRawData( const CvFileStorage* fs, const CvFileNode* src, 106
CvSeqReader* reader); fs tập tin lưu trữ src nút tập tin (một chuỗi) để đọc số từ reader Pointer để ngườ i đọc trình tự Hàm khở i tạo cho ngườ i đọc trình tự để đọc dữ liệu từ một nút tập tin. Đọc khở i tạo có thể sau đó đượ c truyền đến ReadRawDataSlice. cvStartWriteStruct Bắt đầu viết một cấu trúc mớ i. void cvStartWriteStruct( CvFileStorage* fs, const char* name, int struct flags, const char* typeName=NULL, CvAttrList attributes=cvAttrList() ); fs tập tin lưu trữ name tên của cấu trúc bằng văn bản. Cấu trúc này có thể đượ c truy cập bở i tên này khi lưu tr ữ đượ c đọc. struct_flags một sự kết hợ p của các giá trị sau: CV_NODE_SEQ cấu trúc bằng văn bản là một chuỗi (xem thảo luận của CvFileStorage), là, các yếu tố của nó không có m ột tên. CV_NODE_MAP cấu trúc văn bản một b ản đồ (xem thảo luận c ủa CvFileStorage), có ngh ĩ a là, tất cả các phần tử của nó có tên. Một và chỉ một trong hai lá cờ trên phải đượ c xác định CV_NODE_FLOW cờ tùy chọn có ý ngh ĩ a cho các dòng YAML. Nó có ngh ĩ a là cấu trúc đượ c viết như là một dòng chảy (không phải là một kh ối), mà là nh ỏ gọn h ơ n. Đó là khuyến cáo sử dụng lá cờ này cho các cấu trúc hoặc các mảng mà các thành ph ần của tất cả các vô hướ ng. typeName tham số tùy chọn - tên loại đối tượ ng. Trong trườ ng hợ p của XML, nó đượ c viết như là một type_id thuộc tính của thẻ mở cấu trúc. Trong trườ ng hợ p của YAML, nó đượ c viết sau khi sau dấu hai chấm tên cấu trúc (xem ví d ụ trong bản mô tả CvFileStorage). Chủ yếu là nó đượ c sử dụng v ớ i ng ườ i sử dụng đối tượ ng. Khi lưu trữ đượ c đọc, tên loại mã hóa đượ c sử dụng để xác định loại đối tượ ng (xem CvTypeInfo và FindTypeInfo). attributes tham s ố này không đượ c sử dụng trong việc thực hiện hiện tại Hàm bắt đầu viết một cấu trúc hợ p chất (thu) có th ể là một chuỗi hoặc một bản đồ. Sau khi tất cả các l ĩ nh vực cơ cấu, có thể là vô hướ ng hoặc cấu trúc, đượ c viết, EndWriteStruct nên đượ c gọi là. Hàm này có th ể đượ c sử dụng để nhóm một số đối tượ ng hoặc để thực hiện các write Hàm cho một số đối tượ ng ngườ i dùng (xem CvTypeInfo). cvTypeOf Trả về loại của một đối tượ ng. CvTypeInfo* cvTypeOf( const void* structPtr ); structPtr Các con tr ỏ đối tượ ng Hàm tìm thấy các loại của một đối tượ ng nhất định. Nó lặp qua danh sách các lo ại đã đăng ký và g ọi là is_instance Hàm/ph ươ ng pháp cho mỗi c ấu trúc thông tin lo ại v ớ i đối tượ ng đó cho đến khi một trong những họ không trả về số không hoặc cho đến khi toàn bộ danh sách đã đượ c đi qua. Trong trườ ng hợ p thứ hai, Hàm trả về NULL. 107
cvUnregisterType Unregisters loại. void cvUnregisterType( const char* typeName ); typeName Tên của một loại đăng ký Hàm unregisters một loại vớ i một tên đượ c chỉ định. Nếu tên chưa đượ c biết, nó có thể xác định vị trí các thông tin loại bở i một thể hiện của các loại bằng cách sử dụng typeof hoặc bằng cách lặp lại các danh sách loại, bắt đầu từ FirstType, và sau đó gọi cvUnregisterType(info>typeName). cvWrite Viết một đối tượ ng ngườ i dùng. void cvWrite( CvFileStorage* fs, const char* name, const void* ptr, CvAttrList attributes=cvAttrList() ); fs tập tin lưu trữ name tên của đối tượ ng bằng văn bản. Nếu đượ c NULL nếu và chỉ nếu cấu trúc mẹ là một chuỗi. ptr con trỏ đến đối tượ ng attributes Các thuộc tính của đối tượ ng. Họ là những cụ thể đối vớ i từng loại cụ thể (xem dicsussion dướ i đây). Hàm viết một đối tượ ng để lưu trữ tập tin. Thứ nhất, thông tin lo ại thích hợ p đượ c tìm thấy bằng cách sử dụng Typeof. Sau đó, phươ ng pháp write liên quan đến thông tin loại đượ c gọi là. Các thuộc tính đượ c sử dụng để tùy chỉnh các thủ tục bằng văn bản. Các loại tiêu chuẩn hỗ trợ các các thuộc tính (tất cả các thuộc tính *dt định dạng giống như trong WriteRawData): 1. CvSeq header_dt mô tả của các l ĩ nh vực ng ườ i sử dụng của tiêu đề trình tự theo CvSeq, hoặc CvChain (Nếu trình tự là một chuỗi Freeman) hoặc CvContour (nếu trình tự là một đườ ng viền hoặc điểm trình tự) dt mô tả các yếu tố trình tự. recursive nếu thuộc tính là hiện tại và không phải là bằng "0" hoặc "false", cả cây trình tự (đườ ng viền) đượ c lưu trữ. 2. Cvgraph header_dt mô tả tiêu đề của các l ĩ nh vực ngườ i sử dụng tiêu đề đồ thị sau CvGraph; vertex_dt mô tả của các l ĩ nh vực ngườ i sử dụng các đỉnh đồ thị edge_dt mô tả của các l ĩ nh vực ngườ i sử dụng của các c ạnh đồ thị (lưu ý rằng trọng lượ ng cạnh luôn luôn là bằng văn bản, vì vậy không cần phải xác định nó một cách rõ ràng) Dướ i đây là đoạn code mà t ạo ra các file YAML đượ c hiển thị trong phần mô tả CvFileStorage: #include "cxcore.h" int main( int argc, char** argv ) { CvMat* mat = cvCreateMat( 3, 3, CV\_32F ); CvFileStorage* fs = cvOpenFileStorage( "example.yml", 0, CV\_STORAGE\_WRITE 108
); cvSetIdentity( mat ); cvWrite( fs, "A", mat, cvAttrList(0,0) ); cvReleaseFileStorage( &fs ); cvReleaseMat( &mat ); return 0; } cvWriteComment Viết một lờ i. void cvWriteComment( CvFileStorage* fs, const char* comment, int eolComment); fs tập tin lưu trữ comment Các nhận xét bằng văn bản, một dòng hoặc nhiều dòng eolComment Nếu không phải số không, Hàm sẽ cố gắng để đưa các bình luận ở cuối dòng hiện tại. N ếu c ờ là s ố không, nếu nh ận xét là nhiều dòng, hoặc n ếu nó không phù hợ p ở phần cuối của dòng hiện tại, bình luận bắt đầu một dòng mớ i. Hàm viết một bình luận vào lưu trữ tập tin. Các ý ki ến đượ c bỏ qua khi lưu trữ đượ c đọc, để họ có thể chỉ đượ c sử dụng để gỡ lỗi hoặc các mục đích mô tả. cvWriteFileNode Viết một nút tập tin để lưu trữ tập tin khác. void cvWriteFileNode( CvFileStorage* fs, const char* new node name, const CvFileNode* node, int embed ); fs Điểm đến tập tin lưu trữ new_file_node tên tập tin mớ i nút mớ i của các nút t ập tin trong việc lưu trữ tập tin đích. Để giữ cho hiện tại tên, sử dụng cvGetFileNodeName node Nút bằng văn bản embed Nếu nút bằng văn bản là một bộ sưu tập và tham số này là không không, không có thêm các hiararchy đượ c tạo ra. Thay vào đó, tất cả các yếu tố của nút đượ c viết vào các cấu trúc hiện bằng văn bản. Tất nhiên, các yếu tố bản đồ có thể đượ c ghi vào b ản đồ, và có thể đượ c các yếu tố của chuỗi viết chỉ để một chuỗi. Hàm viết m ột b ản sao của một nút tập tin lưu tr ữ tập tin. Các ứng dụng có thể Hàm sáp nhập các kho tập tin nhau thành một và chuyển đổi giữa các định dạng XML và YAML. cvWriteInt Viết một giá trị số nguyên. void cvWriteInt( CvFileStorage* fs, const char* name, int value); fs tập tin lưu trữ 109
name tên c ủa giá trị bằng văn bản. Nếu đượ c NULL nếu và chỉ nếu cấu trúc mẹ là một chuỗi. value giá trị bằng văn bản Hàm viết một giá trị số nguyên duy nhất (có hoặc không có một tên) để lưu trữ tập tin. cvWriteRawData Ghi số lượ ng nhiều. void cvWriteRawData( CvFileStorage* fs, const void* src, int len, const char* dt ); fs tập tin lưu trữ src con trỏ để mảng bằng văn bản len Số của các phần tử mảng để viết dt Đặc điểm kỹ thuật của mỗi phần tử mảng có định dạng sau ([count]f’u’|’c’|’w’|’s’|’i’|’f’|’d’g)... nơ i mà các nhân vật tươ ng ứng vớ i loại C cơ bản: u 8-bit unsigned s ố c 8-bit đã ký số w 16-bit unsigned số s 16-bit đã ký số i 32-bit đã ký số f đơ n chính xác n ổi điểm số d tăng gấp đôi độ chính xác nổi điểm số r con trỏ, thấp hơ n 32 bit trong đó đượ c viết như một số nguyên đã ký kết. Loại có thể đượ c sử dụng để cấu trúc lưu tr ữ vớ i các liên kết gi ữa các yếu t ố. tính là truy c ập tùy chọn c ủa val UE của một loại nhất định. Ví dụ, 2if có ngh ĩ a là mỗi phần tử mảng là một cấu trúc của 2 số nguyên, theo sau là m ột số dấu chấm động chính xác đơ n. Tươ ng đươ ng vớ i ký hiệu các đặc điểm kỹ thuật trên IIF ', '2 i1f và vv. Các ví d ụ khác: u có ngh ĩ a là mảng bao gồm các byte, và 2d có ngh ĩ a là mảng bao gồm các cặp đôi. Hàm viết một mảng, mà các thành ph ần bao gồm các con số một hoặc nhiều. -Function cuộc gọi có thể đượ c thay thế bằng một vòng lặp có chứa một vài WriteInt và các cu ộc gọi WriteReal, nhưng một g ọi là hiệu qu ả hơ n. L ưu ý rằng b ở i vì không ai trong số các yếu t ố có một cái tên, họ cần phải đượ c viết một chuỗi chứ không phải là một bản đồ. cvWriteReal Viết một giá trị dấu chấm động. void cvWriteReal( CvFileStorage* fs, const char* name, double value ); fs tập tin lưu trữ name tên c ủa giá trị bằng văn bản. Nếu đượ c NULL nếu và chỉ nếu cấu trúc mẹ là một chuỗi. value giá trị bằng văn bản Hàm viết một giá trị nổi-điểm duy nhất (có hoặc không có một tên) để lưu trữ tập tin. Đặc biệt giá trị đượ c mã hóa như sau: NaN (Not A Number) là NaN, ±vô cùng như + Inf (-. Inf)... Ví dụ sau đây cho thấy làm thế nào để sử dụng Hàm viết ở mức độ thấp để lưu tr ữ tùy chỉnh cấu trúc, chẳng hạn như tiêu chí chấm dứt, mà không cần đăng ký một loại mớ i. 110
void write_termcriteria( CvFileStorage* fs, const char* struct_name, CvTermCriteria* termcrit ) { cvStartWriteStruct( fs, struct_name, CV_NODE_MAP, NULL, cvAttrList(0,0)); cvWriteComment( fs, "termination criteria", 1 ); // just a description if( termcrit->type & CV_TERMCRIT_ITER ) cvWriteInteger( fs, "max_iterations", termcrit->max_iter ); if( termcrit->type & CV_TERMCRIT_EPS ) cvWriteReal( fs, "accuracy", termcrit->epsilon ); cvEndWriteStruct( fs ); } cvWriteString Viết một chuỗi văn bản. void cvWriteString( CvFileStorage* fs, const char* name, const char* str, int quote=0 ); fs tập tin lưu trữ name tên c ủa chuỗi bằng văn bản. Nếu đượ c NULL nếu và chỉ nếu cấu trúc mẹ là một chuỗi. str Các chu ỗi văn bản quote Nếu không, các chuỗi văn bản đượ c đặt trong dấu ngoặc kép, bất kể cho dù họ đượ c yêu cầu. Nếu không, nếu lá cờ là s ố không, báo giá đượ c sử dụng chỉ khi họ đượ c yêu cầu (ví dụ như khi chuỗi bắt đầu bằng một chữ số hoặc chứa khoảng trắng). Hàm viết một chuỗi văn bản để lưu trữ tập tin.
1.6 Phân nhóm và Tìm kiếm trong không gian đa chiều cvKMeans2 Chia tách tập các vect ơ bở i một số lượ ng nhất định các cụm. int cvKMeans2(const CvArr* samples, int nclusters, CvArr* labels, CvTermCriteria termcrit, int attempts=1, CvRNG* rng=0, int flags=0, CvArr* centers=0, double* compactness=0); samples nổi ma trận điểm của mẫu đầu vào, một hàng cho mỗi mẫu nclusters Số cụm để phân chia các thi ết lập bở i labels đầu ra vector số nguyên chỉ số lưu trữ cluster cho tất cả các mẫu termcrit Chỉ định số lượ ng tối đa của lặp đi lặp lại và / hoặc tính chính xác (khoảng cách trung tâm có thể di chuyển bằng giữa lặp đi lặp lại sau này) attempts cố gắng bao nhiêu l ần các thuật toán đượ c thực hiện bằng cách sử dụng labelings khác nhau ban đầu. Các thuật toán- trả về rithm nhãn mang lại nhỏ gọn tốt nhất (xem các thông số Hàm cuối cùng) rng Tùy chọn ng ẫu nhiên số máy phát điện bên ngoài, có th ể đượ c s ử dụng để hoàn toàn ki ểm soát đượ c Hàm haviour 111
flags có thể là 0 hoặc CV_KMEANS_USE_INITIAL_LABELS. Các giá tr ị này có ngh ĩ a là trong nỗ lực đầu tiên (và có thể là duy nhất), Hàm sử dụng ngườ i dùng cung cấp nhãn như ban đầu x ấp x ỉ thay vì tạo ra các nhãn ng ẫu nhiên. Đối v ớ i nh ững n ỗ lực th ứ hai và tiếp t ục, Hàm sẽ sử dụng các nhãn đượ c tạo ra ngẫu nhiên trong bất kỳ trườ ng hợ p nào centers tùy chọn mảng đầu ra của các trung tâm c ụm compactness tham số đầu ra tùy chọn, đượ c tính như ∑i || samplesi - centerslabelsi ||2 sau khi mọi n ỗ lực, giá trị tốt nh ất (t ối thiểu) đượ c ch ọn và các nhãn t ươ ng ứng đượ c tái quay bằng Hàm. Về cơ bản, ngườ i sử dụng chỉ có thể sử dụng cốt lõi của Hàm, thiết lập số lượ ng các nỗ lực đến 1, khở i tạo nhãn mỗi thờ i gian sử dụng một thuật toán tùy chỉnh (flags=CV_KMEAN_USE_INITIAL_L) và, dựa trên chặt đầu ra hoặc b ất k ỳ tiêu chuẩn khác, chọn phân nhóm tốt nhất. CvKMeans2 Hàm thực hiện một thuật toán k-có ngh ĩ a là tìm thấy các trung tâm c ủa nclusters cụm, nhóm các mẫu đầu vào xung quanh các c ụm. Đầu ra, labels(i) ch ứa m ột c ụm ch ỉ số cho các mẫu đượ c lưu trữ ở hàng thứ i của samples ma trận. #include "cxcore.h" #include "highgui.h" void main( int argc, char** argv ) { #define MAX_CLUSTERS 5 CvScalar color_tab[MAX_CLUSTERS]; IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 ); CvRNG rng = cvRNG(0xffffffff); color_tab[0] = CV_RGB(255,0,0); color_tab[1] = CV_RGB(0,255,0); color_tab[2] = CV_RGB(100,100,255); color_tab[3] = CV_RGB(255,0,255); color_tab[4] = CV_RGB(255,255,0); cvNamedWindow( "clusters", 1 );for(;;) { int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1; int i, sample_count = cvRandInt(&rng)%1000 + 1; CvMat* points = cvCreateMat( sample_count, 1, CV_32FC2 ); CvMat* clusters = cvCreateMat( sample_count, 1, CV_32SC1 ); /* generate random sample from multigaussian distribution */ for( k = 0; k < cluster_count; k++ ) { CvPoint center; CvMat point_chunk; center.x = cvRandInt(&rng)%img->width; center.y = cvRandInt(&rng)%img->height; cvGetRows( points, &point_chunk, k*sample_count/cluster_count, (k == (cluster_count - 1)) ? sample_count : (k+1)*sample_count/cluster_count ); 112
cvRandArr( &rng, &point_chunk, CV_RAND_NORMAL, cvScalar(center.x,center.y,0,0), cvScalar(img->width/6, img->height/6,0,0) ); } /* shuffle samples */ for( i = 0; i < sample_count/2; i++ ) { CvPoint2D32f* pt1 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count; CvPoint2D32f* pt2 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count; CvPoint2D32f temp; CV_SWAP( *pt1, *pt2, temp ); } cvKMeans2( points, cluster_count, clusters, cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 )); cvZero( img ); for( i = 0; i < sample_count; i++ ) { CvPoint2D32f pt = ((CvPoint2D32f*)points->data.fl)[i]; int cluster_idx = clusters->data.i[i];cvCircle( img, cvPointFrom32f(pt), 2, color_tab[cluster_idx], CV_FILLED ); } cvReleaseMat( &points ); cvReleaseMat( &clusters ); cvShowImage( "clusters", img ); int key = cvWaitKey(0); if( key == 27 ) break; } }
Chươ ng 2: cv. Xử lý hình ảnh và thị giác máy tính
2.1 Lọc hình ảnh Hàm và các l ớ p học đượ c mô tả trong phần này đượ c sử dụng để thực hiện khác hau, tuyến tính hoặc phi tuyến tính lọc các hoạt động trên hình ảnh 2D (đại diện là cv), có ngh ĩ a là, đối vớ i mỗi vị trí pixel (x, y) trong nguồn hình ảnh một số khu vực (thườ ng là hình ch ữ nhật) đượ c xem xét và đượ c s ử dụng để tính toán các ph ản ứng. Trong trườ ng hợ p của một b ộ lọc tuyến 113
tính, nó là một tổng trọng số của các giá tr ị pixel, trong trườ ng hợ p của hình thái học hoạt động đó là ... tối thiểu hoặc t ối đa ph ản ứng tính toán đượ c l ưu tr ữ đến đích hình ảnh ở cùng một v ị trí (x, y). Nó có ngh ĩ a là, rằng hình ảnh đầu ra sẽ có kích thướ c tươ ng tự như hình ảnh nhập vào. Thông thườ ng, Hàm hỗ trợ đa kênh mảng, trong trườ ng h ợ p này mỗi kênh xử lý độc l ập, do đó hình ảnh đầu ra cũng sẽ có cùng số lượ ng các kênh như là một đầu vào. Một tính năng phổ biến của các Hàm và các l ớ p học đượ c mô tả trong phần này là, không giống như Hàm số học đơ n giản, họ cần phải ngoại suy các giá trị của một số điểm ảnh không tồn tại. Đối vớ i cũ Ví dụ, nếu chúng ta muốn làm mịn hình ảnh bằng cách sử dụng một Gaussian 3 × 3 bộ lọc, sau đó trong lúc xử lý các điểm ảnh bên trái trong mỗi hàng, chúng tôi cần điểm ảnh bên trái của họ, tức là bên ngoài của hình ảnh. Chúng tôi có thể cho phép những điểm ảnh tươ ng tự như các điểm ảnh hình ảnh trái (tức là sử dụng "nhân rộng biên giớ i" extrapolation phươ ng pháp), hoặc gi ả định r ằng t ất c ả các điểm ảnh không tồn t ại là số không ("contant biên giớ i" ngoại suy phươ ng pháp). IplConvKernel Một IplConvKernel là một hạt nhân chập hình chữ nhật, đượ c tạo ra bở i Hàm CreateStructuringElementEx. cvCopyMakeBorder Bản sao một hình ảnh và làm cho một biên giớ i xung quanh nó. void cvCopyMakeBorder( const CvArr* src, CvArr* dst, CvPoint offset, int bordertype, CvScalar value=cvScalarAll(0) ); src Các hình ảnh nguồn dst Các hình ảnh điểm đến offset Tọa độ của góc trên bên trái (ho ặc phía dướ i bên trái trong trườ ng hợ p của hình ảnh phía dướ i bên trái xu ất xứ) của hình chữ nhật hình ảnh điểm đến, nơ i nguồn hình ảnh (ROI) đượ c sao chép. Kích th ướ c của rectanlge phù h ợ p vớ i nguồn hình ảnh kích thướ c / ROI kích thướ c bordertype Loại biên giớ i để tạo ra xung quanh hình ch ữ nhật hình ảnh sao chép mã ngu ồn, các loại trong : IPL_BORDER_CONSTANT biên giớ i đượ c làm đầy vớ i các giá tr ị cố định, đượ c thông qua như một tham số cuối cùng của Hàm. IPL_BORDER_REPLICATE các điểm ảnh từ các hàng trên và d ướ i, bên trái nhất và phải hầu hết các cột đượ c nhân rộng để điền vào các biên giớ i. (Hai loại khẩu khác từ IPL, IPL_BORDER_REFLECT và IPL_BORDER_WRAP, hi ện không đượ c hỗ trợ ) valueGiá trị của các điểm ảnh biên giớ i nếu bordertype là IPL_BORDER_CONSTANT 114
Hàm sao chép các mảng nguồn 2D thành ph ần bên trong của các mảng đích và làm cho một biên giớ i c ủa các loại quy định xung quanh khu vực sao chép. Hàm này r ất h ữu d ụng khi một trong những nhu cầu thi đua loại biên giớ i là khác nhau từ một trong những nhúng vào một thuật toán cụ thể implementation. Ví dụ, hình thái Hàm, c ũng như hầu hết các Hàm lọc khác trong OpenCV, nội bộ sử dụng các loại biên giớ i nhân rộng, trong khi ngườ i sử dụng có thể cần một biên giớ i không, biên giớ i, tràn đầy 1 hoặc 255. cvCreateStructuringElementEx Tạo một yếu tố cấu trúc. IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchorX, int anchorY, int shape, int* values=NULL ); cols Số cột trong các yếu tố cấu trúc rows Số hàng trong các yếu tố cấu trúc anchorX tươ ng đối ngang bù đắp của các điểm neo anchorY thẳng đứng tươ ng đối bù đắp của các điểm neo shape Hình dạng của các yếu tố cấu trúc, có th ể có giá trị sau: CV_SHAPE_RECT một yếu tố hình chữ nhật CV_SHAPE_CROSS một yếu tố hình chữ thập CV_SHAPE_ELLIPSE một yếu tố elip CV_SHAPE_CUSTOM một yếu tố ngườ i dùng định ngh ĩ a. Trong trườ ng hợ p này các values tham số quy định c ụ thể mặt nạ, có ngh ĩ a là, những ngườ i hàng xóm c ủa điểm ảnh phải đượ c xem xét values Con trỏ trỏ tớ i các yếu t ố cấu trúc dữ liệu, một m ảng máy bay, đại di ện cho hàng hàng quét nguyên tố của ma trận. Các giá trị khác không cho th ấy điểm thuộc v ề phần t ử. N ếu con trỏ NULL, sau đó t ất c ả các giá trị đượ c coi là không-không, có ngh ĩ a là phần tử của một hình chữ nhật. Tham số này đượ c coi là chỉ khi hình là CV_SHAPE_CUSTOM Hàm CreateStructuringElementEx phân b ổ và lấp đầy IplConvKernel cấu trúc, mà có th ể đượ c sử dụng như một yếu tố cơ cấu trong hoạt động hình thái. cvDilate Làm giãn một hình ảnh bằng cách sử dụng một yếu tố cấu trúc cụ thể. void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 ); 115
src Nguồn hình ảnh dst Điểm đến hình ảnh element phần tử Cơ cấu sử dụng cho sự giãn nở . Nếu nó là NULL, một 3 × 3 hình ch ữ nhật cơ cấu thành phần đượ c sử dụng iterations Số lần của thờ i gian giãn nở đượ c áp dụng Hàm làm giãn các ngu ồn hình ảnh b ằng cách sử dụng các yếu t ố cấu trúc quy định c ụ thể để xác định hình dạng của một khu phố điểm ảnh tối đa đượ c lấy: Hàm này hỗ trợ chế độ tại chỗ. Sự giãn nở có thể đượ c áp dụng nhiều (lặp lại) lần. Đối vớ i hình ảnh màu sắc, mỗi kênh đượ c xử lý độc lập. cvErode Làm xói mòn hình ảnh bằng cách sử dụng một yếu tố cấu trúc cụ thể. void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1); src Nguồn hình ảnh dst Điểm đến hình ảnh element Cơ cấu thành phần yếu tố đượ c sử dụng để xói mòn. Nếu nó là NULL, một 3 × 3 hình chữ nhật cơ cấu thành phần đượ c sử dụng iterations số lần xói mòn Hàm làm xói mòn nguồn hình ảnh b ằng cách sử dụng các yếu t ố cấu trúc quy định c ụ thể để xác định hình dạng của một khu phố pixel mà tối thiểu là: Hàm này hỗ trợ chế độ tại chỗ. Xói mòn có th ể đượ c áp dụng nhiều (l ặp l ại) l ần. Đối v ớ i hình ảnh màu sắc, mỗi kênh đượ c xử lý độc lập. cvFilter2D Convolves một hình ảnh vớ i hạt nhân. void cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1)); src Các hình ảnh nguồn dst Các hình ảnh điểm đến 116
kernel Convolution hạt nhân , một ma trận điểm một kênh nổi. Nếu bạn muốn áp dụng khác nhau hạt nhân đến các kênh khác nhau, phân chia các hình ảnh vào máy bay màu sắc riêng biệt bằng cách sử dụng cvSplit xử lý cá nhân anchor neo của hạt nhân cho biết vị trí tươ ng đối của m ột điểm l ọc trong hạt nhân. Neo shoud nằm trong hạt nhân. Giá trị mặc định đặc biệt (-1, -1) có ngh ĩ a là nó là ở trung tâm hạt nhân Hàm áp dụng một bộ lọc tuyến tính tùy ý để hình ảnh. Hoạt động tại chỗ đượ c hỗ trợ . Khi khẩu độ là một phần bên ngoài hình ảnh, Hàm nội suy các giá trị điểm ảnh outlier từ các pixel gần nhất nằm bên trong hình ảnh. cvLaplace Tính Laplacian c ủa một hình ảnh. void cvLaplace( const CvArr* src, CvArr* dst, int apertureSize=3); src Nguồn hình ảnh dst Điểm đến hình ảnh apertureSize kích th ướ c độ mở ống kính (nó có ý ngh ĩ a tươ ng tự như cvSobel) Hàm tính toán Laplacian c ủa nguồn hình ảnh b ằng cách thêm vào th ứ hai x và y các ch ất d ẫn xuất tính bằng cách sử dụng các toán tử Sobel:
Thiết apertureSize = 1 cung c ấp cho các phiên b ản nhanh nhất là bằng convolving các hình ảnh vớ i hạt nhân sau đây: 01 0 1 -4 1 10 1 Tươ ng tự như Hàm cvSobel, mở rộng quy mô không đượ c th ực hiện và kết hợ p cùng một đầu vào và định dạng đầu ra đượ c hỗ trợ . cvMorphologyEx Thực hiện chuyển đổi hình thái học tiên tiến. void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations=1 ); src Nguồn hình ảnh dst Điểm đến hình ảnh 117
temp thờ i tạm thờ i hình ảnh, cần thiết trong một số trườ ng hợ p element Cơ cấu thành phần phần tử operation Loại hình thái hoạt động, một trong những điều sau đây: CV_MOP_OPEN mở CV_MOP_CLOSE đóng cửa CV_MOP_GRADIENT hình thái CV_MOP_TOPHAT "đầu mũ" CV_MOP_BLACKHAT "mũ đen" iterations số thờ i gian xói mòn và s ự giãn nở đượ c áp dụng Hàm có thể thực hiện chuyển đổi hình thái h ọc tiên tiến bằng cách sử dụng xói mòn và s ự giãn nở là hoạt động cơ bản. Mở cửa: dst = open(src, element) = dilate(erode(src, element), element) Kết thúc: dst = close(src, element) = erode(dilate(src, element), element) Hình thái độ dốc: dst = morph grad(src, element) = dilate(src, element) erode(src, element) "Mũ": dst = tophat(src, element) = src open(src, element) "Mũ đen": dst = blackhat(src, element) = close(src, element) src Tạm thờ i hình ảnh tạm thờ i là cần thiết cho một gradient hình thái h ọc, và trong tr ườ ng hợ p tại chỗ hoạt động đối vớ i "đầu mũ" và "mũ đen". cvPyrDown Downsamples một hình ảnh. void cvPyrDown( const CvArr* src, CvArr* dst, int filter=CV GAUSSIAN 5x5 ); src Các hình ảnh nguồn dst hình ảnh điểm đến, cần phải có một nửa chiều rộng và chiều cao lớ n hơ n so vớ i nguồn filter Loại của bộ lọc đượ c sử dụng cho chập, chỉ CV_GAUSSIAN 5x5 hiện đang đượ c hỗ trợ . Hàm thực hiện các bướ c downsampling của phân hủy kim tự tháp Gaussian. Đầu tiên nó convolves nguồn hình ảnh vớ i bộ lọc đượ c chỉ định và sau đó downsamples hình ảnh bằng cách từ bỏ thậm chí cả hàng và cột. cvReleaseStructuringElement Xoá một yếu tố cấu trúc. void cvReleaseStructuringElement( IplConvKernel** element ); 118
element con tr ỏ đến các yếu tố cấu trúc đã bị xóa Hàm phát hành IplConvKernel c ấu trúc mà không còn cần thiết. Nếu *element là NULL, Hàm không có tác dụng. cvSmooth Làm mềm hình ảnh trong một trong nhiều cách. void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV GAUSSIAN, int param1=3, int param2=0, double param3=0, double param4=0); src Các hình ảnh nguồn dst Các hình ảnh điểm đến smoothtype Loại làm mịn: CV_BLUR_NO_SCALE tuyến tính convolution v ớ i param1 × param2 h ộp hạt nhân (tất cả 1). Nếu bạn muốn làm mịn điểm ảnh khác nhau vớ i các hạt nhân hộp kích thướ c khác nhau, bạn có thể sử dụng tích phân hình ảnh đượ c tính toán bằng cách sử dụng cvIntegral CV_BLUR tuyến tính convolution vớ i param1 × param2 hộp hạt nhân (tất cả 1) vớ i tiếp theo mở rộng quy mô bằng 1 / (param1 · param2) CV_GAUSSIAN tuyến tính convolution vớ i × param1 param2 Gaussian hạt nhân CV_MEDIAN trung bình lọc vớ i một param1 × param1 vuông kh ẩu độ CV_BILATERAL phươ ng song phươ ng bộ lọc vớ i một param1 × param1 vuông kh ẩu độ, màu sắc sigma = param3 và không gian sigma = param4. N ếu param1 = 0, bên kh ẩu độ vuông đượ c thiết lập để cvRound (param4 * 1.5) * 2 +1. Thông tin v ề việc lọc song phươ ng có thể đượ c tìm thấy tại http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html param1 tham s ố đầu tiên của hoạt động làm mịn, chiều rộng khẩu độ. Phải tích cực số lẻ (1, 3, 5, ...) param2 tham số thứ hai của ho ạt động làm mịn, chiều cao khẩu độ. Bỏ qua CV_MEDIAN và CV_BILATERAL. Trong trườ ng h ợ p đơ n gi ản quy mô / không quy mô và Gaussian blur n ếu param2 là số không, nó đượ c thiết lập để param1. Nếu không, nó phải là một lẻ tích cực số. param3 Trong trườ ng hợ p của một tham số Gaussian tham số này có thể chỉ định Gaussian (tiêu chuẩn độ lệch). Nếu nó là số không, nó đượ c tính toán từ các kích thướ c hạt nhân: param1 cho hạt nhân ngang
119
Sử dụng tiêu chuẩn sigma hạt nhân nhỏ (3 × 3-7 × 7) cho tốc độ tốt hơ n. Nếu param3 là không bằng không, trong khi param1 param2 là s ố không, kích thướ c hạt nhân đượ c tính từ sigma (để cung cấp chính xác hoạt động đủ). Hàm làm mềm m ột hình ảnh b ằng cách sử dụng một trong một số phươ ng pháp. Mỗi c ủa các phươ ng pháp có một số tính năng và hạn chế đượ c liệt kê dướ i đây Blur vớ i quy mô không hoạt động vớ i m ột kênh hình ảnh và hỗ trợ tích lũy của bit-8 để định dạng 16-bit (tươ ng tự cvSobel và cvLaplace) và 32-bit d ấu chấm động 32-bit floating-point định dạng. Mờ đơ n giản và hỗ trợ Gaussian blur 1 hoặc 3-kênh, 8-bit và hình ảnh 32-bit dấu ch ấm động. Hai phươ ng pháp có thể xử lý hình ảnh tại chỗ. Bộ lọc trung bình và song phươ ng làm việc v ớ i 1 hoặc 3-kênh hình ảnh 8-bit và không th ể xử lý hình ảnh tại chỗ. cvSobel Tính toán đầu tiên thứ hai, các dẫn xuất hình ảnh thứ ba hoặc hỗn hợ p bằng cách sử dụng một toán tử Sobel mở rộng. void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int apertureSize=3 ); src Nguồn hình ảnh của loại CvArr dst Điểm đến hình ảnh xorder thứ tự của x phẩm phái sinh yorder Trình tự các y phái sinh apertureSize Kích thướ c của hạt nhân Sobel mở rộng, phải là 1, 3, 5 ho ặc 7 Trong mọi tr ườ ng hợ p, ngoại tr ừ 1, một h ạt nhân apertureSize × apertureSize tách s ẽ đượ c s ử dụng để tính đạo hàm. Đối vớ i apertureSize = 1 a 3 × 1 ho ặc 1 x 3 một hạt nhân đượ c sử dụng (Gaussian làm mịn không đượ c thực hiện). Ngoài ra còn có giá tr ị đặc biệt CV_SCHARR (-1) tươ ng ứng v ớ i m ột 3 × 3. Scharr b ộ lọc có thể cho kết qu ả chính xác hơ n 3 × 3 Sobel. Scharr khẩu độ -3 0 3 -10 0 10 -3 0 3 cho x-phái sinh, hoán cho y-phái sinh. Hàm tính toán các d ẫn xuất hình ảnh bằng convolving hình ảnh thích hợ p hạt nhân:
120
Các nhà khai thác Sobel k ết hợ p Gaussian làm mịn và sự khác biệt vì vậy kết quả là h ơ n ho ặc ít hơ n khả năng chống tiếng ồn. Thông thườ ng, Hàm đượ c gọi là (xorder = 1, yorder = 0, apertureSize = 3) ho ặc (xorder = 0, yorder = 1, apertureSize = 3) để tính toán đầu tiên x hoặc y-hình ảnh phái sinh. Trườ ng hợ p đầu tiên tươ ng ứng vớ i một hạt nhân: -1 0 1 -2 0 2 -1 0 1 và thứ hai tươ ng ứng vớ i một hạt nhân: -1 -2 -1 0 0 0 1 2 1 hoặc một hạt nhân: 1 2 1 0 0 0 -1 2 -1 tùy thuộc vào nguồn gốc hình ảnh (nguồn gốc l ĩ nh vực cấu trúc IplImage). Mở rộng quy mô không đượ c thực hiện, do đó hình ảnh điểm đến thườ ng có số lượ ng lớ n (giá trị tuyệt đối) so vớ i nguồn hình ảnh. Để tránh tràn, Hàm đòi h ỏi một hình ảnh điểm đến 16-bit nếu nguồn hình ảnh là 8-bit. Kết quả có thể đượ c chuyển đổi trở lại-8 bit bằng cách sử dụng cvConvertScale hoặc các cvConvertScaleAbs Hàm. Bên c ạnh đó hình ảnh 8-bit Hàm có thể xử lý hình ảnh 32bit floating-point. Cả hai nguồn và đích đến phải là một kênh hình ảnh có kích thướ c bằng nhau hoặc kích cỡ ROI bằng.
2.2 Ảnh hình học biến đổi Các Hàm trong phần này thực hiện chuyển đổi hình học của hình ảnh 2D. Đó là, họ không thay đổi n ội dung hình ảnh, nhưng biến d ạng lướ i điểm ảnh, và bản đồ lướ i này bị biến dạng. điểm đến hình ảnh. Trong thực tế, để tránh các hi ện vật lấy mẫu, lập bản đồ đượ c thực hiện theo thứ tự ngượ c l ại, từ điểm đến nguồn. Đó là, mỗi điểm ảnh (x, y) của hình ảnh đích, Hàm tính toán tọa độ của điểm ảnh tươ ng ứng "nhà tài trợ " trong hình ảnh nguồn và sao chép các điểm ảnh giá trị, đó là: dst (x, y) = src (f x (x, y), f y (x, y)) Trong trườ ng hợ p khi ngườ i dùng xác định lập bản đồ về phía trướ c : , các OpenCV Hàm đầu tiên tính toán l ập bản đồ tươ ng ứng vớ i nghịch đảo: và sau đó sử dụng công thức trên. Thực tế triển khai của biến đổi hình học, từ cvRemap chung nhất và cvResize đơ n giản nhất và nhanh nhất, cần phải giải quyết 2 vấn đề chính vớ i các bên trên công th ức: 1. ngoại suy của các điểm ảnh không tồn t ại. T ươ ng tự như Hàm lọc, đượ c mô tả trong vious phần, đối vớ i một s ố (x, y) f x (x, y) hoặc f y (x, y), hoặc cả hai, có thể rơ i bên ngoài hình ảnh, trong trườ ng hợ p một số phươ ng pháp ngoại suy cần phải đượ c sử dụng. OpenCV cung cấp 121
việc lựa chọn cùng một trong những phươ ng pháp ngoại suy như trong các Hàm lọc, nhưng cũng là một quảng cáo ditional phươ ng pháp BORDER_TRANSPARENT, có ngh ĩ a là các điểm ảnh tươ ng ứng trong hình ảnh điểm đến sẽ không đượ c sửa đổi tất cả. 2. suy của giá trị pixel. Thông thườ ng f x (x, y) và f y (x, y) là số điểm nổi (tức là f x, f y có thể là một chuyển đổi afin hoặc quan điểm, hay biến dạng ống kính điều chỉnh b ố trí hình tròn vv), do đó, một giá trị pixel tại t ọa độ phân đoạn c ần ph ải đượ c l ấy ra. Trong trườ ng h ợ p đơ n gi ản các tọa độ có thể đượ c làm tròn đến tọa độ số nguyên gần nhất và tươ ng ứng các điểm ảnh đượ c s ử dụng, đượ c g ọi là gần nhất, hàng xóm nội suy. Tuy nhiên, một k ết qu ả tốt h ơ n có thể thể đạt đượ c bằng cách sử dụng phươ ng pháp nội suy phức tạp hơ n, nơ i mà một hàm đa thức là phù hợ p vớ i m ột số vùng lân cận của điểm ảnh tính (f x (x, y), f y (x, y)) và sau đó giá trị của đa thức (f x (x, y), f y (x, y)) đượ c thực hiện như là giá trị điểm ảnh nội suy. Trong OpenCV bạn có thể lựa chọn giữa nhiều phươ ng pháp nội suy, xem cvResize. cvGetRotationMatrix2D Tính ma trận afin quay 2d. CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle, double scale, CvMat* mapMatrix ); center Trung tâm luân chuy ển nguồn hình ảnh angle Các góc quay ở các mức độ. Giá trị tích cực có ngh ĩ a là quay ngượ c chiều kim đồng h ồ (coor- nguồn gốc dinate đượ c giả định là các góc trên cùng, bên trái) scale đẳng hướ ng quy mô yếu tố mapMatrix Con trỏ trỏ tớ i các điểm đến 2 × 3 ma tr ận Cv2DRotationMatrix Hàm tính toán ma tr ận sau đây:
Vớ i α = scale . cos(angle), β = scale . sin(angle) Việc chuyển đổi b ản đồ các trung tâm luân chuy ển đến chính nó. Nếu đây không phải là mục đích, sự thay đổi đượ c điều chỉnh.
cvGetAffineTransform Tính affine biến đổi từ 3 điểm tươ ng ứng. CvMat* cvGetAffineTransform( const CvPoint2D32f* src, const CvPoint2D32f* dst, CvMat* mapMatrix ); src Tọa độ của 3 đỉnh tam giác trong hình ảnh nguồn 122
dst Tọa độ của 3 đỉnh tam giác tươ ng ứng vớ i hình ảnh điểm đến mapMatrix Con trỏ trỏ tớ i các điểm đến 2 × 3 ma tr ận CvGetAffineTransform Hàm tính toán ma tr ận của một affine biến đổi như vậy mà:
nơ i cvGetPerspectiveTransform Tính quan điểm chuyển đổi từ 4 điểm tươ ng ứng. CvMat* cvGetPerspectiveTransform( const CvPoint2D32f* src, const CvPoint2D32f* dst, CvMat* mapMatrix ); src Tọa độ 4 đỉnh tứ giác trong hình ảnh nguồn dst Tọa độ 4 đỉnh tứ giác tươ ng ứng vớ i hình ảnh điểm đến mapMatrix Con trỏ trỏ tớ i các điểm đến 3 × 3 ma tr ận CvGetPerspectiveTransform Hàm tính toán m ột ma trận của quan điểm biến đổi như vậy mà:
nơ i
cvGetQuadrangleSubPix Lấy tứ giác điểm ảnh từ một hình ảnh vớ i độ chính xác phân điểm ảnh. void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* mapMatrix ); src Nguồn hình ảnh dst Trích tứ giác mapMatrix Việc chuyển đổi 2 x 3 ma tr ận [A | b] (xem các cu ộc thảo luận) CvGetQuadrangleSubPix Hàm chiết xuất từ các điểm ảnh từ src độ chính xác sub-pixel và l ưu trữ chúng dst như sau: vớ i và 123
Các giá trị của pixel tại t ọa độ số nguyên không đượ c l ấy ra bằng cách sử dụng n ội suy song tuyến tính. Khi Hàm c ần điểm ảnh bên ngoài của hình ảnh, nó sử dụng chế độ biên giớ i nhân rộng để tái tạo lại giá trị. Mỗi kênh nhiều kênh hình ảnh đượ c xử lý độc lập. cvGetRectSubPix Lấy hình chữ nhật pixel từ một hình ảnh vớ i độ chính xác sub-pixel. void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center ); src Nguồn hình ảnh dst Trích hình ch ữ nhật center nổi tọa độ điểm của trung tâm hình ch ữ nhật đượ c chiết xuất trong hình ảnh nguồn. Các trung tâm phải đượ c bên trong hình ảnh điểm ảnh CvGetRectSubPix Hàm chiết xuất từ các từ src: nơ i mà các giá tr ị của các điểm ảnh tại tọa độ số nguyên không đượ c lấy ra bằng cách sử dụng song tuyến tính interpo lation. M ỗi kênh nhiều kênh hình ảnh đượ c xử lý độc lập. Trong khi hình chữ nhật trung tâm ph ải đượ c bên trong hình ảnh, các bộ phận của hình chữ nhật có thể đượ c bên ngoài. Trong tr ườ ng hợ p này, việc nhân rộng chế độ biên giớ i đượ c sử dụng để có đượ c các giá tr ị điểm ảnh vượ t ra ngoài ranh giớ i hình ảnh. cvLogPolar Remaps một hình ảnh để đăng nhập không gian cực. void cvLogPolar( const CvArr* src, CvArr* dst, CvPoint2D32f center, double M, int flags=CV INTER LINEAR+CV WARP FILL OUTLIERS ); src Nguồn hình ảnh dst Điểm đến hình ảnh center Trung tâm chuy ển đổi, nơ i mà độ chính xác đầu ra là tối đa M Tầm quan trọng quy mô tham số. Xem dướ i đây flags Một sự kết hợ p của phươ ng pháp nội suy và những lá cờ tùy chọn sau đây: CV_WARP_FILL_OUTLIERS lấp đầy tất cả các điểm ảnh hình ảnh điểm đến. Nếu một số trong số họ corre spond Bên ngoài trong các nguồn hình ảnh, họ thiết lập để không CV_WARP_INVERSE_MAP Xem dướ i đây CvLogPolar Hàm biến đổi hình ảnh nguồn bằng cách sử dụng việc chuyển đổi sau đây: 124
Chuyển tiếp chuyển đổi (CV_WARP_INVERSE_MAP không đượ c thiết lập): Inverse chuyển đổi (CV_WARP_INVERSE_MAP đượ c thiết lập): nơ i Hàm giả lập tầm nhìn của con ngườ i "foveal" và có thể đượ c sử dụng cho quy mô nhanh và quay bất biến mẫu phù hợ p, để theo dõi đối tượ ng và vv. Các Hàm không th ể hoạt động tại chỗ. #include #include int main(int argc, char** argv) { IplImage* src; if( argc == 2 && (src=cvLoadImage(argv[1],1) != 0 ) { IplImage* dst = cvCreateImage( cvSize(256,256), 8, 3 ); IplImage* src2 = cvCreateImage( cvGetSize(src), 8, 3 ); cvLogPolar( src, dst, cvPoint2D32f(src->width/2,src->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS ); cvLogPolar( dst, src2, cvPoint2D32f(src->width/2,src->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP ); cvNamedWindow( "log-polar", 1 ); cvShowImage( "log-polar", dst ); cvNamedWindow( "inverse log-polar", 1 ); cvShowImage( "inverse log-polar", src2 ); cvWaitKey(); } return 0; } Và đây là những gì chươ ng trình sẽ hiển thị khi opencv/samples/c/fruits.jpg đượ c thông qua nó
125
cvRemap Áp dụng một chuyển đổi hình học chung cho hình ảnh. void cvRemap( const CvArr* src, CvArr* dst, const CvArr* mapx, const CvArr* mapy, int flags=CV INTER LINEAR+CV WARP FILL OUTLIERS, CvScalar fillval=cvScalarAll(0) ); src Nguồn hình ảnh dst Điểm đến hình ảnh MapX Các bản đồ của x-tọa độ (CV_32FC1 hình ảnh) mapy bản đồ của y-tọa độ (CV_32FC1 hình ảnh) flags Một sự kết hợ p của phươ ng pháp nội suy và cờ tùy chọn sau đây (s): CV_WARP_FILL_OUTLIERS lấp đầy tất cả các điểm ảnh hình ảnh điểm đến. Nếu một số trong số họ correspond Bên ngoài trong các ngu ồn hình ảnh, họ thiết lập để fillval fillval Một giá trị sử dụng để điền Bên ngoài CvRemap Hàm biến đổi hình ảnh nguồn bằng cách sử dụng bản đồ quy định: dst(x; y) = src(mapx(x; y), mapy(x; y)) Tươ ng tự như để biến đổi hình học khác, một s ố phươ ng pháp nội suy (quy định bở i ngườ i s ử dụng) đượ c sử dụng để trích xuất các pixel vớ i các t ọa độ số nguyên không. Lưu ý rằng các Hàm không thể hoạt động tại chỗ. cvResize Thay đổi kích thướ c hình ảnh. void cvResize( const CvArr* src, 126
CvArr* dst, int interpolation=CV INTER LINEAR ); src Nguồn hình ảnh dst Điểm đến hình ảnh interpolation Phươ ng pháp nội suy : CV_INTER_NN gần nhất-neigbor nội suy CV_INTER_LINEAR nội suy song tuyến tính (sử dụng mặc định) CV_INTER_AREA lấy mẫu lại bằng cách sử dụng mối quan hệ khu vực điểm ảnh. Đây là phươ ng pháp ưa thích cho im tuổi decimation cho kết quả không gợ n sóng. Trong điều kiện của phóng to nó cũng tươ ng tự như CV_INTER_NN phươ ng pháp CV_INTER_CUBIC bicubic suy CvResize Hàm thay đổi kích thướ c một src hình ảnh để nó phù hợ p vớ i chính xác vào dst. N ếu ROI đượ c thiết lập, Hàm xem xét t ỷ lệ hoàn vốn như hỗ trợ . cvWarpAffine Áp dụng một chuyển đổi afin một hình ảnh. void cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* mapMatrix, int flags=CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) ); src Nguồn hình ảnh dst Điểm đến hình ảnh mapMatrix 2 × 3 chuyển đổi ma trận flags Một sự kết hợ p của phươ ng pháp nội suy và những lá cờ tùy chọn sau đây: CV_WARP_FILL_OUTLIERS lấp đầy tất cả các điểm ảnh hình ảnh điểm đến, nếu một số ngườ i trong số họ correspond Bên ngoài trong các ngu ồn hình ảnh, họ thiết lập để fillval CV_WARP_INVERSE_MAP cho thấy rằng ma trận nghịch chuyển đổi từ điểm đến hình ảnh nguồn, và do đó, có thể đượ c sử dụng trực tiếp cho nội suy điểm ảnh. Nếu không, Hàm tìm thấy các biến đổi ngượ c từ mapMatrix fillval Một giá trị sử dụng để điền Bên ngoài CvWarpAffine Hàm biến đổi hình ảnh nguồn bằng cách sử dụng ma trận xác định: nơ i
127
Hàm này tươ ng tự như cvGetQuadrangleSubPix nhưng họ không chính xác như nhau. cvWarpAffine yêu cầu đầu vào và đầu ra hình ảnh có cùng một kiểu dữ liệu, có chi phí l ớ n hơ n (do đó, nó không phải là khá phù hợ p đối vớ i hình ảnh nhỏ) và có thể để lại một phần của hình ảnh đích không thay đổi. Trong khi cvGetQuad rangleSubPix có thể trích xuất t ứ từ 8-bit hình ảnh vào bộ đệm điểm n ổi, đã nh ỏ hơ n trên đầu và luôn luôn thay đổi n ội dung điểm đến toàn bộ hình ảnh. Lưu ý rằng Hàm có thể không hoạt động tại chỗ. Để chuyển đổi một tập hợ p thưa thớ t điểm, sử dụng Hàm cvTransform từ cxcore. cvWarpPerspective Áp dụng một biến đổi quan điểm cho một hình ảnh. void cvWarpPerspective( const CvArr* src, CvArr* dst, const CvMat* mapMatrix, int flags=CV INTER LINEAR+CV WARP FILL OUTLIERS, CvScalar fillval=cvScalarAll(0) ); src Nguồn hình ảnh dst Điểm đến hình ảnh mapMatrix 3 × 3 chuyển đổi ma trận flags Một sự kết hợ p của phươ ng pháp nội suy và những lá cờ tùy chọn sau đây: CV_WARP_FILL_OUTLIERS lấp đầy tất cả các điểm ảnh hình ảnh điểm đến, nếu một số ngườ i trong số họ correspond Bên ngoài trong các ngu ồn hình ảnh, họ thiết lập để fillval CV_WARP_INVERSE_MAP cho thấy rằng ma trận nghịch chuyển đổi từ điểm đến hình ảnh nguồn, và do đó, có thể đượ c sử dụng trực tiếp cho nội suy điểm ảnh. Nếu không, Hàm tìm thấy các biến đổi ngượ c từ mapMatrix fillval Một giá trị sử dụng để điền Bên ngoài CvWarpPerspective Hàm biến đổi hình ảnh nguồn bằng cách sử dụng ma trận xác định:
Lưu ý rằng các Hàm không thể hoạt động tại chỗ. Đối vớ i một tập hợ p thưa thớ t của các điểm sử dụng cvPerspectiveTransform Hàm t ừ CxCore.
2.3 Hình ảnh hỗn hợ p biến đổi cvAdaptiveThreshold Áp dụng một ngưỡ ng thích nghi vào một mảng. void cvAdaptiveThreshold( const CvArr* src, 128
CvArr* dst, double maxValue, int adaptive method=CV ADAPTIVE THRESH MEAN C, int thresholdType=CV THRESH BINARY, int blockSize=3, double param1=5 ); src Nguồn hình ảnh dst Điểm đến hình ảnh maxValue tối đa giá trị đượ c sử dụng vớ i CV_THRESH_BINARY và CV_THRESH BINARY_INV adaptive_method thích ứng ngưỡ ng thuật toán để sử dụng: CV_ADAPTIVE_THRESH_MEAN_C hoặc CV_ADAPTIVE_THRESH_GAUSSIAN_C (xem các cu ộc thảo luận) thresholdType ngưỡ ng loại; phải là một trong CV_THRESH_BINARY xxx CV_THRESH_BINARY_INV xxx blockSize Các kích th ướ c của một khu phố điểm ảnh đượ c sử dụng để tính toán một giá trị ngưỡ ng điểm ảnh: 3, 5, 7, và như vậy param1 phụ thuộc vào phươ ng pháp tham số. Đối vớ i các phươ ng pháp thích nghi CV_ADAPTIVE_THRESH_MEAN_C và CV_ADAPTIVE_THRESH_GAUSSIAN_C là một hằng s ố đượ c tr ừ từ trung bình hoặc tr ọng trung bình (xem các cu ộc th ảo lu ận), mặc dù nó có thể đượ c tiêu cực Hàm biến đổi một màu xám hình ảnh vào một ảnh nhị phân theo công thức: CV_THRESH_BINARY
CV_THRESH_BINARY_INV
T (x, y) là một ngưỡ ng tính riêng biệt cho mỗi điểm ảnh. Đối vớ i phươ ng pháp CV_ADAPTIVE_THRESH_MEAN_C nó là blockSize × blockSize điểm ảnh lân cận, trừ param1. Đối v ớ i ph ươ ng pháp CV_ADAPTIVE_THRESH_GAUSSIAN_C là tổng trọng s ố (gaussian) của một blockSize × blockSize điểm ảnh kích cỡ khối, trừ param1. cvCvtColor Chuyển đổi một hình ảnh từ một không gian màu khác. void cvCvtColor( const CvArr* src, CvArr* dst, int code ); 129
src Nguồn 8-bit (8u), hình ảnh 16-bit (16u) hoặc duy nhất chính xác floating-point (32F) dst hình ảnh điểm đến c ủa cùng một ki ểu d ữ liệu như là nguồn g ốc. S ố lượ ng các kênh có th ể đượ c khác nhau code màu chuyển đổi hoạt động có thể đượ c specifed s ử dụng CV_src_color_space 2 dst_color_space hằng số (xem dướ i đây) Hàm chuyển đổi hình ảnh đầu vào từ một không gian màu khác. Hàm b ỏ qua các l ĩ nh vực colorModel và channelSeq c ủa tiêu đề IplImage, vì vậy nguồn hình ảnh màu sắc không gian có thể quy định một cách chính xác (bao g ồm cả thứ tự của các kênh trong tr ườ ng hợ p không gian RGB. Ví dụ, BGR có ngh ĩ a là định dạng 24-bit B0, G0, R0, B1, G1, R1, ... b ố trí trong khi RGB có ngh ĩ a là 24 định dạng vớ i R0, G0, B0, R1, G1, B1, ... bố trí). Phạm vi thông thườ ng cho R, G, B kênh giá tr ị là: · 0 đến 255 cho hình ảnh 8-bit · 0 đến 65535 cho hình ảnh 16-bit và · 0-1 cho hình ảnh nổi-điểm. Tất nhiên, trong trườ ng h ợ p c ủa bi ến đổi tuyến tính, phạm vi có thể đượ c c ụ thể, nh ưng để có đượ c kết quả chính xác trong trườ ng hợ p biến đổi phi tuyến tính, hình ảnh đầu vào đượ c thu nhỏ. Các Hàm có thể làm biến đổi sau đây: · Biến đổi trong không gian RGB nh ư thêm / gỡ bỏ các kênh alpha, đảo chiều kênh trật tự, chuyển đổi đến / từ 16-bit màu RGB (R5: G6: B5 ho ặc R5: G5: B5), cũng như chuyển đổi đến / từ màu xám bằng cách sử dụng: Và Việc chuyển đổi từ một hình ảnh RGB để màu xám đượ c thực hiện vớ i: cvCvtColor(src ,bwsrc, CV_RGB2GRAY) RGB CIE XYZ.Rec 709 with D65 white point (CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB): •
X, Y và Z bao gồm các phạm vi toàn bộ giá trị (trong trườ ng hợ p hình ảnh nổi điểm Z có thể vượ t quá 1). •
RGB YCrCb JPEG (a.k.a. YCC) (CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB )
130
Vớ i
Y, Cr và Cb bao g ồm toàn bộ phạm vi giá trị. RGB↔HSV (CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB ) trong trườ ng hợ p hình ảnh 8-bit và 16-bit R, G và B đượ c chuyển đổi sang định dạng dấu chấm động và quy mô để phù hợ p vớ i khoảng 0-1 •
nếu H < 0 thì H <- H + 360 Ngày đầu ra 0 <= V <= 1.0 <= S <= 1.0 <= H <= 360. Các giá trị này sau đó đượ c chuyển đổi sang các loại dữ liệu điểm đến: Ảnh 8-bit •
•
•
•
Hình ảnh 16-bit (hiện không đượ c hỗ trợ ) Hình ảnh 32-bit H, S, V trái như là RGB↔HLS (CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB). trong trườ ng hợ p hình ảnh 8-bit và 16-bit R, G và B đượ c chuyển đổi sang định dạng dấu chấm động và quy mô để phù hợ p vớ i phạm vi từ 0 đến 1. •
•
•
•
131
•
if then On output , , Các giá trị này sau đó đượ c chuyển đổi sang các loại dữ liệu điểm đến: Ảnh 8-bit
.
•
•
Hình ảnh 16-bit (hiện không đượ c hỗ trợ )
•
Hình ảnh 32-bit H, S, V trái như là
•
trong trườ ng hợ p hình ảnh-8 bit và 16-bit R, G và B đượ c chuyển đổi định dạng dấu chấm động và quy mô để phù hợ p vớ i khoảng 0-1 RGB↔CIE
L*a*b*(CV_BGR2Lab,CV_RGB2Lab,CV_Lab2BGR,CV_Lab2RGB)
•
•
•
•
•
•
Vớ i
và
Ở đầu ra 0 <= L <= 100, -127 <= a<= 127, -127 <= b <= 127 Các giá trị này sau đó đượ c chuyển đổi sang các loại dữ liệu điểm đến: Ảnh 8-bit •
• •
Hình ảnh 16-bit không đượ c hỗ trợ Hình ảnh 32-bit L, a, b, còn l ại là
132
•
RGB↔CIE L*u*v* (CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB) trong
trườ ng hợ p hình ảnh-8 bit và 16-bit R, G và B đượ c chuyển đổi định dạng dấu chấm động và quy mô để phù hợ p vớ i 0 đến 1 phạm vi
•
•
•
•
•
•
Ngày đầu ra 0 <= L <= 100, -134 <= u <= 220, -140 <= v <= 122. Các giá trị này sau đó đượ c chuyển đổi sang các loại dữ liệu điểm đến: Ảnh 8-bit •
Hình ảnh 16-bit không đượ c hỗ trợ Hình ảnh 32-bit L, u, v trái nh ư là Các công thức trên để chuyển đổi RGB / từ không gian màu khác nhau đã đượ c lấy t ừ nhiều nguồn trên trang web, chủ yếu là từ Ford98 tại trang web Charles Poynton. • •
•
Bayer→RGB (CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerGB2RGB, CV_BayerRG2RGB, CV_BayerGR2RGB) Các Bayer mô hình s ử dụng rộng rãi trong các máy ảnh CCD và
CMOS. Nó cho phép một để có đượ c hình ảnh màu sắc từ một máy bay duy nh ất, n ơ i pixels R, G và B (c ảm biến của một thành phần cụ thể) đượ c xen kẽ như thế này:
Sản lượ ng các thành phần RGB của một điểm ảnh đượ c nội suy từ 1, 2 hoặc 4 ngườ i hàng xóm của điểm ảnh có cùng một màu sắc. Có một số đượ c sửa đổi của mô hình trên có th ể đượ c đạt đượ c bằng cách dịch chuyển bên trái mô hình điểm ảnh và / hoặc một trong những điểm ảnh lên. Hai chữ C1 và C2 trong các hằng số chuyển đổi CV_Bayer C1C2 2BGR và CV_Bayer C1C2 2RGB chỉ các loại mô hình cụ thể - đây là những thành phần từ hàng thứ hai, thứ hai và thứ ba cột, tươ ng ứng. Ví dụ, mô hình trên đã rất phổ biến loại "BG". cvDistTransform 133
Tính khoảng cách đến các điểm ảnh không gần gũi nhất cho tất cả các điểm ảnh khác không của hình ảnh nguồn. void cvDistTransform( const CvArr* src, CvArr* dst, int distance type=CV DIST L2, int mask size=3, const float* mask=NULL, CvArr* labels=NULL ); src 8-bit, một kênh (nhị phân) nguồn hình ảnh dst Đầu ra hình ảnh vớ i khoảng cách tính (32-bit floating-point, single-kênh) distance_type về khoảng cách, can be CV_DIST_L1, CV_DIST_L2, CV_DIST_C or CV_DIST_USER mask_size Kích th ướ c của mặt n ạ khoảng cách biến đổi, có thể là 3 hoặc 5. trong trườ ng ng hợ p của CV_DIST_L1 hoặc CV_DIST_C tham số này là buộc phải đến 3, vì 3 x 3 m ặt nạ cung cấp cho cùng một kết quả như một 5 × 5 nhưng nó là nhanh hơ n mask mặt nạ ngườ i dùng định ngh ĩ a trong tr ườ ng ng h ợ p của một khoảng cách ngườ i dùng định ngh ĩ a, a, nó bao gồm 2 con số (hor izontal / chi phí thay đổi theo chiều dọc, đườ ng ng chéo thay đổi chi phí) trong trườ ng ng h ợ p OFA 3 × 3 mặt n ạ và 3 số điện thoại (Ngang / dọc thay đổi chi phí, đườ ng ng chéo thay đổi chi phí, chi phí di chuy ển của những hiệp s ỹ) trong trườ ng ng hợ p của một 5 × 5 mặt nạ labels Các mảng đầu ra tùy chọn 2d nhãn kiểu số nguyên, kích thướ c giống như src và dst Hàm tính toán kho ảng cách xấp xỉ từ mỗi điểm ảnh hình ảnh nhị phân gần nhất không điểm ảnh. Đối vớ i không pixels Hàm thi ết lập khoảng cách bằng không đối vớ i những ngườ i khác mà nó tìm thấy con đườ ng ng ngắn nhất bao gồm những thay đổi c ơ bản: di chuyển ngang, dọc, chéo hoặc của những hiệp s ỹ (mớ i nh ất hiện có sẵn 5 × 5 mặt n ạ). Khoảng cách tổng thể đượ c tính như là một tổng hợ p c ủa nh n hững khoảng cách cơ bản. B ở i vì khoảng cách Hàm nên đượ c đối xứng, tất cả trong sự chuyển dịch theo chiều ngang và dọc phải có cùng một chi phí (đượ c ký hiệu là a), tất c ả các thay đổi đườ ng ng chéo phải có cùng chi phí (ký hiệu là b), và tất c ả các của những hiệp sỹ di chuyển phải có cùng chi phí (ký hi ệu là c). Đối vớ i CV_DIST_C và CV_DIST_L1 khoảng cách đượ c tính toán chính xác, trong khi đối vớ i CV_DIST_L2 (Ơclít khoảng cách), khoảng cách có thể đượ c tính chỉ vớ i một số lỗi tươ ng ng đối (5 × 5 mặt nạ cho kết quả chính xác hơ n), n), OpenCV sử dụng các giá trị đề nghị trong [4]: CV_DIST_C (3 x 3) a=1 CV_DIST_L1 (3 x 3) a = 1, b = 2 CV_DIST_L2 (3 x 3) a=0.955, b=1.3693 a=1, b=1.4, c=2.1969 CV_DIST_L2 (5 × 5) Và dướ i đây là mẫu của trườ ng ng khoảng cách (đen (0) điểm ảnh là ở giữa màu trắng vuông) trườ ng ng hợ p của một khoảng cách ngườ i dùng định ngh ĩ a: a: Ngườ i dùng định ngh ĩ a 3 × 3 mặt nạ (a = 1, b = 1,5) 134
4.5
4
3.5
3
3.5
4
4.5
4
3
2.5
2
2.5
3
4
3.5
2.5
1.5
1
1.5
2.5
3.5
3
2
1
1
2
3
3.5
2.5
1.5
1
1.5
2.5
3.5
4
3
2.5
2
2.5
3
4
4.5
4
3.5
3
3.5
4
4.5
Ngườ i dùng định ngh ĩ a 5 × 5 mặt nạ (a = 1, b = 1,5, c = 2) 4.5
3.5
3
3
3
3.5
4.5
3.5
3
2
2
2
3
3.5
3
2
1.5
1
1.5
2
3
3
2
1
1
2
3
3
2
1.5
1
1.5
2
3
3.5
3
2
2
2
3
3.5
4
3.5
3
3
3
3.5
4
Thông thườ ng, ng, đối vớ i một khoảng cách, nhanh chóng thô d ự toán CV_DIST_L2, 3×3 mặt nạ đượ c sử dụng, và cho một CV dự toán khoảng cách chính xác h ơ n CV_DIST_L2, 5 × 5 m ặt nạ đượ c sử dụng. Khi sản l ượ ng ng labels tham số không phải là NULL, cho m ỗi điểm ảnh khác không Hàm c ũng tìm thấy các thành ph ần kết nối gần nhất bao gồm không pixels. Kết nối các thành phần tự đượ c tìm thấy như đườ ng ng viền trong đầu của hàm. Trong chế độ này thờ i gian xử lý là O (N), trong đó N là s ố lượ ng ng điểm ảnh. Như vậy, Hàm ơ đồ Voronoi gần đúng cho hình ảnh nhị phân. cung cấp một cách rất nhanh để tính toán sơ đồ CvConnectedComp typedef struct CvConnectedComp { double area; /* area of the segmented seg mented component */ CvScalar value; /* average color of the connected component */ CvRect rect; /* ROI of the segmented component */ CvSeq* contour; /* optional component boundary (the contour might have child contours corresponding to the holes) */ } CvConnectedComp; cvFloodFill Điền vào các ô một thành phần kết nối vớ i các màu sắc nhất định. void cvFloodFill( CvArr* image, 135
CvPoint seed point, CvScalar new val, CvScalar lo diff=cvScalarAll(0), diff =cvScalarAll(0), CvScalar up diff=cvScalarAll(0), CvConnectedComp* comp=NULL, int flags=4, CvArr* mask=NULL ); image đầu vào - 1 hoặc 3-kênh, hình ảnh 8-bit floating-point. Nó đượ c sửa đổi bở i các Hàm trừ khi CV_FLOODFILL_MASK_ONLY chỉ đượ c thiết lập (xem dướ i đây) seed_point Điểm khở i đầu new_val giá trị của các điểm ảnh miền sơ n lại lo_diff tối đa thấp hơ n độ sáng / màu sắc khác biệt giữa các điểm ảnh hiện đang quan sát và các nướ c láng giềng thuộc các thành ph ần, hoặc điểm ảnh một hạt giống đượ c bổ sung vào thành phần. Trong trườ ng ng hợ p các hình ảnh màu sắc 8-bit, nó là m ột giá trị đóng gói up_diff sự khác biệt tối đa độ sáng / màu sắc trên giữa các điểm ảnh hiện đang quan sát và m ột các nướ c láng giềng thuộc các thành ph ần, hoặc điểm ảnh một hạt giống đượ c bổ sung vào thành phần. Trong trườ ng ng hợ p các hình ảnh màu sắc 8-bit, nó là m ột giá trị đóng gói comp Con trỏ trỏ tớ i cấu trúc Hàm l ấp đầy v ớ i những thông tin về sơ n lại làm- chính. Lưu ý ĩ nh rằng các Hàm không điền vào comp-> l ĩ nh v ực đườ ng ng viền. Ranh giớ i c ủa đầy thành phần có thể đượ c lấy từ hình ảnh mặt nạ đầu ra bằng cách sử dụng cvFindContours flags Các hoạt động c ờ . Bit thấp ch ứa giá trị kết n ối, 4 (theo mặc định) hoặc 8, đượ c s ử dụng trong Hàm. Kết nối xác định ngườ i hàng xóm c ủa một điểm ảnh đượ c coi là. Trên bit có th ể là 0 hoặc sự kết hợ p của những lá cờ sau đây: CV_FLOODFILL_FIXED_RANGE nếu thiết lập, sự khác biệt giữa các điểm ảnh hiện tại và hạt giống Các điểm ảnh đượ c coi là, n ếu không sự khác biệt giữa các điểm ảnh lân cận đượ c xem là ( phạm vi nổi) CV_FLOODFILL_MASK_ONLY, nếu thiết lập các Hàm không điền vào các hình ảnh (new_val là bỏ qua), nhưng đầy mặt nạ (phải là không NULL trong tr ườ ng ng hợ p này) mask mặt nạ hoạt động, nên là một kênh hình ảnh 8-bit, 2 pixel r ộng hơ n và 2 pixel cao hơ n image. Nếu không phải là NULL, Hàm s ử dụng và cập nhật các mặt n ạ, vì vậy ngườ i sử dụng có lại sponsibility khở i tạo nội dung mask. Floodfilling không thể đi qua các điểm ảnh khác không trong mặt nạ, ví dụ, một đầu ra cạnh máy dò có th ể đượ c sử dụng như một mặt nạ để điền ở cạnh. Có thể sử dụng mặt nạ giống nhau trong nhiều cuộc gọi đến Hàm để đảm bảo các đầy khu vực không chồng chéo lên nhau. L ưu ý: vì mặt nạ lớ n h ơ n so vớ i hình ảnh đầy, m ột điểm ảnh trong mask t ươ ng ng ứng vớ i (x, y) điểm ảnh trong image sẽ có tọa độ (x + 1, y + 1) Hàm lấp đầy m ột thành phần kết n ối b ắt đầu từ điểm giống vớ i màu quy định. Kết nối đượ c xác định bở i sự gần gũi của các giá tr ị điểm ảnh. Các điểm ảnh (x, y) đượ c coi là thu ộc về miền sơ n lại nếu: màu xám hình ảnh, phạm vi nổi •
•
màu xám hình ảnh, phạm vi cố định 136
•
màu sắc hình ảnh, phạm vi nổi
•
màu sắc hình ảnh, phạm vi cố định
src (x’, y’) là giá tr ị của m ột n ướ c láng giềng của điểm ảnh. Đó là, để đượ c thêm vào các k ết nối thành phần, màu sắc / độ sáng của điểm ảnh nên đượ c gần đủ để: Màu sắc / độ sáng của một trong các nướ c láng giềng đã gọi các thành phần đượ c kết nối trong trườ ng hợ p của phạm vi nổi Màu sắc / độ sáng của điểm hạt giống trong trườ ng hợ p của phạm vi cố định. •
•
cvInpaint Inpaints khu vực đượ c lựa chọn trong hình ảnh. void cvInpaint( const CvArr* src, const CvArr* mask, CvArr* dst, double inpaintRadius, int flags); src 8-bit đầu vào 1 kênh hoặc hình ảnh 3-kênh. mask mặt nạ inpainting, 8-bit 1 kênh hình ảnh. Các điểm ảnh khác không cho th ấy khu vực có nhu cầu đượ c inpainted. dst hình ảnh đầu ra của định dạng và kích thướ c giống như đầu vào. inpaintRadius bán kính c ủa khu phố circlular của mỗi điểm inpainted đượ c coi là bằng các thuật toán. flags inpainting phươ ng pháp, một trong những điều sau đây: CV_INPAINT_NS phươ ng trình Navier-Stokes dựa trên phươ ng pháp. CV_INPAINT_TELEA phươ ng pháp Alexandru Telea [21] Hàm tái cấu trúc khu vực hình ảnh đượ c lựa chọn từ các điểm ảnh gần ranh giớ i khu vực. Hàm có thể đượ c sử dụng để loại bỏ bụi và vết trầy xướ c từ một bức ảnh quét, hoặc loại bỏ đối tượ ng không mong muốn từ các hình ảnh t ĩ nh hoặc video. cvIntegral Tính tích phân c ủa một hình ảnh. 137
void cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tiltedSum=NULL ); Những hình ảnh hình ảnh nguồn, W × H, 8-bit floating-point (32F ho ặc 64f) sum hợ p hình ảnh không thể tách rờ i, (W + 1) × (H + 1), s ố nguyên hoặc tăng gấp đôi độ chính xác 32-bit floating-point (64f) sqsum Những hình ảnh không thể thiếu đối vớ i các giá tr ị pixel vuông, (W + 1) × (H + 1), g ấp đôi độ chính xác nổi điểm (64f) tiltedSum thể thiếu cho các ảnh xoay 45 độ, (W + 1) × (H + 1), cùng một dữ liệu loại như sum Hàm tính toán một hoặc nhiều hình ảnh tách rờ i cho hình ảnh nguồn như sau:
Sử dụng những hình ảnh tách rờ i, ngườ i ta có thể tính toán tổng hợ p, trung bình và độ lệch tiêu chuẩn trên một c ụ thể, lên bên phải ho ặc xoay khu vực hình chữ nhật c ủa hình ảnh trong một thờ i gian liên t ục, ví dụ: Nó làm cho có th ể làm mờ nhanh hoặc tươ ng quan khối nhanh chóng vớ i kích thướ c cửa sổ biến, ví dụ. Trong trườ ng hợ p của hình ảnh đa kênh, các khoản tiền cho mỗi kênh đượ c tích lũy độc lập. cvPyrMeanShiftFiltering Không phân chia nhỏ hình ảnh meanshift void cvPyrMeanShiftFiltering( const CvArr* src, CvArr* dst, double sp, double sr, int max level=1, CvTermCriteria termcrit= cvTermCriteria(CV TERMCRIT ITER+CV TERMCRIT EPS,5,1)); src Nguồn 8-bit, hình ảnh 3-kênh. dst hình ảnh điểm đến của cùng một định dạng và kích thướ c giống như nguồn. 138
sp Bán kính cửa sổ không gian. sr Các cửa sổ màu sắc bán kính. max_level tối đa của kim tự tháp cho các phân khúc. termcrit tiêu chí ch ấm dứt khi nào phải ngừng lặp đi lặp lại meanshift. Các Hàm thực hiện các giai đoạn lọc của phân khúc meanshift, đó là, đầu ra của Hàm là lọc "posterized" hình ảnh vớ i gradient màu sắc và kết cấu tốt, hạt dẹt. Tại mỗi điểm ảnh (X, Y) hình ảnh đầu vào (hoặc hình ảnh đầu vào vớ i quy mô nhỏ hơ n, xem dướ i đây) Hàm thực hiện meanshift lặp đi lặp lại, có ngh ĩ a là, các điểm ảnh (X, Y) khu phố trong HyperSpace không gian màu sắc chung là xem xét: (R, G, B) và (r, g, b) là các vect ơ của các thành ph ần màu (X, Y) và (x, y), (mặc dù, các thuật toán không phụ thuộc vào không gian màu sắc đượ c sử dụng, vì vậy bất kỳ thành phần 3không gian màu sắc có thể đượ c sử dụng thay thế). Trong khu vực không gian giá trị trung bình (X ', Y') và vector màu trung bình (R, G, B) đượ c tìm thấy và họ hành động như là trung tâm khu phố kế tiếp lặp đi lặp lại: Sau lặp đi lặp lại trên, các thành phần màu sắc của các điểm ảnh ban đầu (có ngh ĩ a là, các điểm ảnh từ nơ i lặp đi lặp lại bắt đầu) đượ c thiết lập để các giá trị cuối cùng (màu s ắc trung bình tại phiên cuối cùng): Sau đó, max_level> 0, kim tự tháp gaussian max_level + c ấp 1 đượ c xây dựng, và ở trên thủ tục chạy trên các l ớ p nhỏ nhất. Sau đó, kết qu ả đượ c tuyên truyền để các lớ p lớ n hơ n và lặp đi lặp lại là chạy một lần nữa chỉ vào những điểm ảnh mà màu sắc lớ p khác nhau nhiều (sr) từ lớ p có độ phân giải thấp h ơ n, đó là ranh giớ i của khu vực màu đượ c làm rõ. Lưu ý, rằng Các kết quả sẽ đượ c thực sự khác nhau từ những ngườ i thu đượ c bằng cách chạy các thủ tục meanshift các hình ảnh ban đầu toàn bộ (tức là khi max_level == 0). cvPyrSegmentation Thực hiện phân khúc hình ảnh của kim tự tháp. void cvPyrSegmentation( IplImage* src, IplImage* dst, CvMemStorage* storage, CvSeq** comp, int level, double threshold1, double threshold2 ); src Các hình ảnh nguồn dst Các hình ảnh điểm đến storage lưu trữ , lưu trữ các chuỗi kết quả của các thành ph ần kết nối comp con trỏ đến các chuỗi đầu ra của các thành phần phân đoạn 139
level tối đa mức độ của kim tự tháp cho phân đoạn threshold1 Lỗi ngưỡ ng cho việc thiết lập các liên k ết threshold2 Lỗi ngưỡ ng cho các phân nhóm phân đoạn Hàm thực hi ện phân chia nh ỏ hình ảnh b ằng kim tự tháp. Kim tự tháp này đượ c xây dựng lên đến mức độ cấp. Các liên kết giữa bất kỳ điểm ảnh trên một mức độ i và cha ứng cử viên b điểm ảnh trên liền kề mức độ đượ c thành lập nếu p (c (a), c (b))
CV_THRESH_BINARY_INV
CV_THRESH_TRUNC 140
CV_THRESH_TOZERO
CV_THRESH_TOZERO_INV
Ngoài ra, giá tr ị đặc biệt CV_THRESH_OTSU có thể đượ c kết hợ p vớ i một trong các giá tr ị trên. Trong trườ ng hợ p này, Hàm xác định giá trị ngưỡ ng t ối ưu bằng cách sử dụng thuật toán Otsu và sử dụng nó thay vì quy định thresh. Hàm trả về giá trị ngưỡ ng tính toán. Hiện nay, Otsu của phươ ng pháp chỉ đượ c thực hiện cho hình ảnh 8-bit.
141
2.4 Biểu đồ CvHistogram Biểu đồ đa chiều. typedef struct CvHistogram { int type; CvArr* bins; float thresh[CV_MAX_DIM][2]; / * cho biểu đồ thống nhất * / float** thresh2;/ * không th ống nhất biểu đồ * / CvMatND mat;/ * nhúng vào ma trận tiêu đề cho biểu đồ mảng * / 142
} CvHistogram; cvCalcBackProject Tính chiếu trở lại. void cvCalcBackProject( IplImage** image, CvArr* back project, const CvHistogram* hist ); image Nguồn hình ảnh (mặc dù bạn có thể vượ t qua CvMat** cũng) back_project Điểm đến chiếu lại hình ảnh của cùng một loại vớ i hình ảnh nguồn hist Histogram Hàm tính toán dự án trở lại của biểu đồ. Đối vớ i mỗi tuple của điểm ảnh tại cùng một vị trí của t ất c ả các hình ảnh đầu vào duy nhất kênh Hàm đặt giá trị của bin biểu đồ, t ươ ng ứng v ớ i các tuple trong hình ảnh điểm đến. Về thống kê, giá trị sản lượ ng mỗi hình ảnh pixel là xác suất của các tuple quan sát đượ c phân phối (biểu đồ). Ví dụ, để tìm thấy một đối tượ ng màu đỏ trong hình, ta có th ể làm như sau: 1. Tính toán một biểu đồ màu sắc cho các đối tượ ng màu đỏ giả hình ảnh chỉ chứa các đối tượ ng này. Biểu đồ có thể có tối đa mạnh mẽ, tươ ng ứng vớ i màu đỏ. 2. Tính toán lại chiếu của một chiếc máy bay màu sắc c ủa hình ảnh đầu vào đối tượ ng là tìm kiếm, sử dụng biểu đồ. Ngưỡ ng hình ảnh. 3. Tìm các thành phần kết nối trong hình kết quả và lựa chọn các thành phần quyền sử dụng một số tiêu chí bổ sung, ví dụ, thành phần kết nối lớ n nhất. Đó là các thu ật toán gần đúng của đối tượ ng theo dõi Camshift màu s ắc, ngoại trừ cho bướ c thứ 3, thay vì đó, thuật toán CAMSHIFT đượ c sử dụng để xác định vị trí các đối tượ ng trên chiếu trở lại vị trí đối tượ ng trướ c đó.
cvCalcBackProjectPatch Đặt một mẫu trong một hình ảnh bằng cách sử dụng một biểu đồ so sánh. void cvCalcBackProjectPatch( IplImage** images, CvArr* dst, CvSize patch size, CvHistogram* hist, int method, float factor ); images Hình ảnh Nguồn (tuy nhiên, bạn có thể vượ t qua CvMat ** cũng) dst Điểm đến hình ảnh patch_size kích th ướ c của các mi ếng vá trượ t mặc dù nguồn hình ảnh hist Histogram 143
method Compasion phươ ng pháp, đượ c thông qua để cvCompareHist (xem mô tả về Hàm đó) factor Bình thườ ng hóa yếu tố cho biểu đồ, sẽ ảnh hưở ng đến quy mô bình thườ ng của đích đến hình ảnh, vượ t qua 1 nếu không chắc chắn Hàm tính toán chiếu trở lại b ằng cách so sánh biểu đồ của hình ảnh nguồn các bản vá lỗi vớ i biểu đồ nhất định. Lấy kết quả đo l ườ ng từ một s ố hình ảnh t ại mỗi địa điểm trên thu nhập t ừ đầu tạo ra một image mảng. Những kết quả này có thể là một hoặc nhiều màu sắc, phái sinh x, y phái sinh, Laplacian l ọc, định hướ ng Gabor bộ lọc, vv Mỗi sản lượ ng đo lườ ng đượ c thu thập thành riêng của mình hình ảnh riêng biệt. Các mảng hình ảnh image là m ột bộ sưu t ập những hình ảnh này đo lườ ng. Một biểu đồ đa chiều hist đượ c xây dựng bằng cách lấy mẫu từ các mảng hình ảnh image. Các biểu đồ cuối cùng là bình thườ ng. Các biểu đồ hist có nhiều kích thướ c như số lượ ng các yếu tố trong mảng hình ảnh. Mỗi hình ảnh mớ i đượ c đo và sau đó chuyển đổi thành một mảng hình ảnh image trong m ột cho sen ROI. Biểu đồ đượ c lấy từ hình ảnh này image trong một khu vực đượ c bao phủ bở i một "miếng vá" vớ i một neo tại trung tâm nh ư trong hình dướ i đây. Biểu đồ đượ c chuẩn hóa bằng cách sử dụng các tham s ố norm_factor để nó có thể đượ c so sánh vớ i hist. Các biểu đồ đượ c tính là compared bi ểu đồ mô hình, hist sử dụng cvCompareHist Hàm so sánh ph ươ ng pháp = method). Kết qu ả đầu ra đượ c đặt ở vị trí tươ ng ứng vớ i bản vá một Chor dst hình ảnh xác suất. Quá trình này đượ c l ặp đi lặp l ại khi bản vá đượ c tr ượ t trên thu nhập t ừ đầu. L ặp đi lặp lại cập nhật biểu đồ bằng cách trừ đi pixels dấu đượ c bao phủ bở i các miếng vá và thêm mớ i pixels phủ để biểu đồ có thể tiết kiệm rất nhiều hoạt động, mặc dù nó không đượ c thực hiện. Tính toán dự án trở lại bở i bản vá
144
cvCalcHist Tính toán biểu đồ của hình ảnh (s). void cvCalcHist( IplImage** image, CvHistogram* hist, int accumulate=0, const CvArr* mask=NULL ); image Nguồn hình ảnh (mặc dù bạn có thể vượ t qua CvMat** cũng) hist con trỏ đến biểu đồ accumulate c ờ tích luỹ. N ếu nó đượ c thiết l ập, biểu đồ là không đượ c xóa trong đầu. Điều này tính năng cho phép ngườ i sử dụng để tính toán một biểu đồ duy nhất t ừ một số hình ảnh, hoặc để cập nhật các biểu đồ trực tuyến mask mặt nạ hoạt động, xác định những điểm ảnh của hình ảnh nguồn đượ c tính Hàm tính toán biểu đồ của một hoặc nhiều kênh hình ảnh đơ n. Các yếu tố một bộ đượ c sử dụng để tăng bin biểu đồ đượ c chụp tại cùng một vị trí từ hình ảnh đầu vào tươ ng ứng. #include #include int main( int argc, char** argv ) { IplImage* src; if( argc == 2 && (src=cvLoadImage(argv[1], 1))!= 0) { IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 ); IplImage* s_plane = cvCreateImage( cvGetSize(src), 8, 1 ); IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 ); IplImage* planes[] = { h_plane, s_plane }; IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 ); int h_bins = 30, s_bins = 32; int hist_size[] = {h_bins, s_bins}; /* hue varies from 0 (˜0 deg red) to 180 (˜360 deg red again) */ float h_ranges[] = { 0, 180 }; /* saturation varies from 0 (black-gray-white) to 255 (pure spectrum color) */ float s_ranges[] = { 0, 255 }; float* ranges[] = { h_ranges, s_ranges }; int scale = 10; IplImage* hist_img = cvCreateImage( cvSize(h_bins*scale,s_bins*scale), 8, 3 ); CvHistogram* hist; float max_value = 0; int h, s; cvCvtColor( src, hsv, CV_BGR2HSV ); cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 ); hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 ); 145
cvCalcHist( planes, hist, 0, 0 ); cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 ); cvZero( hist_img ); for( h = 0; h < h_bins; h++ ) { for( s = 0; s < s_bins; s++ ) { float bin_val = cvQueryHistValue\_2D( hist, h, s ); int intensity = cvRound(bin_val*255/max_value cvRound(bin_val*255/max_value); ); cvRectangle( hist_img, cvPoint( h*scale, s*scale ), cvPoint( (h+1)*scale - 1, (s+1)*scale - 1), CV_RGB(intensity,intensity,intensity), CV_FILLED ); } } cvNamedWindow( "Source", 1 ); cvShowImage( "Source", src ); cvNamedWindow( "H-S Histogram", 1 ); cvShowImage( "H-S Histogram", hist_img ); cvWaitKey(0); } } cvCalcProbDensity Chia một biểu đồ bằng cách khác. void cvCalcProbDensity( const CvHistogram* hist1, const CvHistogram* hist2, CvHistogram* dst hist, double scale=255 ); hist1 biểu đồ đầu tiên (số chia) hist2 thứ hai biểu đồ dst_hist điểm đến biểu đồ scale yếu tố quy mô cho các biểu đồ điểm đến Hàm tính toán mật độ xác suất đối tượ ng ng từ hai biểu đồ như:
Vì vậy, các biểu đồ điểm đến thùng trong vòng ít h ơ n so vớ i quy mô. cvClearHist Xóa biểu đồ. void cvClearHist( CvHistogram* hist ); hist Histogram 146
Hàm thiết l ập t ất c ả các thùng biểu đồ 0 trong trườ ng ng h ợ p c ủa một bi ểu đồ dày đặc và loại b ỏ tất cả các thùng biểu đồ trong trườ ng ng hợ p của một mảng thưa thớ t.t. cvCompareHist So sánh hai biểu đồ dày đặc. double cvCompareHist( const CvHistogram* hist1, const CvHistogram* hist2, int method ); hist1 Các biểu đồ dày đặc đầu tiên hist2 Các biểu đồ thứ hai dày đặc method so sánh phươ ng ng pháp, một trong những điều sau đây: CV_COMP_CORREL tươ ng ng quan CV_COMP_CHISQR Chi-Quảng trườ ng ng CV_COMP_INTERSECT Intersection CV_COMP_BHATTACHARYYA khoảng cách Hàm so sánh hai bi ểu đồ dày đặc bằng cách sử dụng các phươ ng ng pháp quy định (H1 biểu thị đầu tiên biểu đồ, H2 thứ hai): Correlation (method=CV_COMP_CORREL) * •
where
where N is the number of histogram bins. •
Chi-Square (method=CV_COMP_CHISQR) *
•
Intersection (method=CV_COMP_INTERSECT) *
•
Bhattacharyya distance (method=CV_COMP_BHATTACHARYYA) *
Hàm trả d (H1, H2). 147
Lưu ý: phươ ng ng pháp CV_COMP_BHATTACHARYYA chỉ làm việc vớ i biểu đồ bình thườ ng. ng. Để so sánh một bi ểu đồ thưa th ớ t ho ặc th ưa th ớ t c ấu hình chung của các điểm tr ọng, xem xét sử dụng Hàm cvCalcEMD2. cvCopyHist Sao chép một biểu đồ. void cvCopyHist( const CvHistogram* src, CvHistogram** dst ); src Nguồn biểu đồ dst Pointer biểu đồ điểm đến Hàm này làm cho m ột bản sao của biểu đồ. Nếu con trỏ biểu đồ thứ hai * dst là NULL, bi ểu đồ mớ i có cùng kích th ướ c như src đượ c tạo ra. Nếu không, cả hai biểu đồ phải có bằng loại và kích cỡ . Sau đó, các Hàm sao chép các giá tr ị bin của bi ểu đồ nguồn đến đích biểu đồ và đặt giá trị bin cùng phạm vi như trong src. cvCreateHist Tạo một biểu đồ. CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 ); dims Số kích thướ c biểu đồ sizes mảng của các kích thướ c kích thướ c biểu đồ type định dạng biểu đồ đại diện: CV_HIST_ARRAY có ngh ĩ a là các d ữ liệu biểu đồ là đại diện- bực bội như một CvMatND mảng đa chiều dày đặc; CV_HIST_SPARSE có ngh ĩ a là thưa thớ t của anh dữ liệu togram đượ c biểu diễn như là một mảng thưa thớ t đa chiều CvSparseMat ranges mảng phạm vi cho các thùng bi ểu đồ. Ý ngh ĩ a của nó phụ thuộc vào uniform parameter giá trị. Những dãy đượ c s ử dụng cho khi biểu đồ đượ c tính toán ho ặc backprojected xác định tươ ng ng ứng vớ i bin biểu đồ giá trị / tuple các giá tr ị từ đầu vào image (s) ờ đồng nhất, n ếu không phải 0, biểu đồ đã ngang bằng vớ i nhau thùng và cho m ọi 0 uniform cờ đồ <= i < cDims phạm vi [i] là một mảng của hai con s ố thấp hơ n và trên ranh gi ớ i thứ-i-ông togram kích th ướ c. c. Toàn bộ phạm vi [thấp hơ n, n, phía trên sau đó đượ c chia thành làm m ờ [i] bằng phần xác định phạm vi giá trị đầu vào thứ i-tuple cho mỗi thùng biểu đồ. Và nếu thống nhất = 0, sau đó yếu tố thứ i của các phạm vi mảng chứa mờ [i] 1 yếu tố: lower0, upper0, lower1, upper1 lower2, ... upperdims [i] -1 lowerj và upperj th ấp hơ n và trên ranh gi ớ i uple giá trị đầu vào thứ j-bin, thứ i tươ ng ng ứng. Trong cả hai trườ ng ng h ợ p, p, đầu vào giá trị vượ t ra ngoài phạm vi chỉ định cho một bin biểu đồ không đượ c tính cvCalcHist và đầy 0 trong bở i cvCalcBackProject 148
Hàm tạo ra một biểu đồ của kích thướ c quy định và trả về một con trỏ đến việc tạo ra biểu đồ. Nếu mảng ranges là 0, phạm vi bin biểu đồ phải đượ c xác định thông qua Hàm cvSetHistBinRanges. Mặc dù cvCalcHist và cvCalcBackProject có th ể xử lý 8-bit hình ảnh mà không thiết lập phạm vi bin, họ giả định là ngươ i cách đều nhau trong 0 đến 255 thùng. cvGetHistValue * D Trả về một con trỏ đến thùng biểu đồ. float cvGetHistValue 1D(hist, idx0) float cvGetHistValue 2D(hist, idx0, idx1) float cvGetHistValue 3D(hist, idx0, idx1, idx2) float cvGetHistValue nD(hist, idx) hist Histogram idx0, idx1, idx2, idx3 Chỉ số thùng rác idx mảng của các chỉ số #define cvGetHistValue_1D( hist, idx0 ) ((float*)(cvPtr1D( (hist)->bins, (idx0), 0 )) #define cvGetHistValue_2D( hist, idx0, idx1 ) ((float*)(cvPtr2D( (hist)->bins, (idx0), (idx1), 0 ))) #define cvGetHistValue_3D( hist, idx0, idx1, idx2 ) ((float*)(cvPtr3D( (hist)->bins, (idx0), (idx1), (idx2), 0 ))) #define cvGetHistValue_nD( hist, idx ) ((float*)(cvPtrND( (hist)->bins, (idx), 0 ))) GetHistValue macro tr ả về một con trỏ vào thùng quy định của 1D, 2D, 3D hoặc ND biểu đồ. Trong trườ ng hợ p của một biểu đồ thưa thớ t Hàm tạo ra một bin mớ i và đặt nó là 0, trừ khi nó đã tồn tại. cvGetMinMaxHistValue Tìm các thùng t ối thiểu và tối đa biểu đồ. void cvGetMinMaxHistValue( const CvHistogram* hist, float* min value, float* max value, int* min idx=NULL, int* max idx=NULL ); hist Histogram min_value Con trỏ trỏ tớ i giá trị tối thiểu của biểu đồ max_value Con trỏ trỏ tớ i giá trị tối đa của biểu đồ min_idx Con trỏ trỏ tớ i các mảng của các tọa độ cho tối thiểu max_idx Con trỏ trỏ tớ i các mảng của các tọa độ cho tối đa 149
Hàm tìm thấy các thùng tối thiểu và tối đa bi ểu đồ và vị trí của họ. T ất cả sản l ượ ng đối s ố là tùy chọn. Trong số extremas nhau vớ i cùng một giá trị tối thiểu ch ỉ số (trong từ điển để) đượ c trả về. Trong trườ ng h ợ p mức t ối đa ho ặc t ối thiểu một s ố, đầu tiên trong từ điển để (extrema địa điểm) đượ c trả về. cvMakeHistHeaderForArray Làm cho một trong biểu đồ của một mảng. CvHistogram* cvMakeHistHeaderForArray( int dims, int* sizes, CvHistogram* hist, float* data, float** ranges=NULL, int uniform=1 ); dims kích thướ c biểu đồ sizes mảng của các kích thướ c kích thướ c biểu đồ hist tiêu đề biểu đồ đượ c khở i tạo bở i Hàm data mảng sẽ đượ c sử dụng để lưu trữ các thùng biểu đồ ranges bin phạm vi biểu đồ, xem cvCreateHist uniform tính đồng nhất cờ , xem cvCreateHist Hàm khở i tạo biểu đồ, có tiêu đề và các thùng đượ c phân bổ bở i ngườ i sử dụng thứ. cvReleaseHist không c ần phải đượ c gọi sau. Chỉ có biểu đồ dày đặc có thể đượ c khở i tạo cách. Hàm trả về hist. cvNormalizeHist Bình thườ ng hóa các bi ểu đồ. void cvNormalizeHist( CvHistogram* hist, double factor ); hist con trỏ đến biểu đồ factor yếu tố chuẩn hóa Hàm bình thườ ng hóa các thùng biểu đồ bằng cách mở rộng quy mô, chẳng hạn là số tiền c ủa thùng trở nên bằng các factor. cvQueryHistValue*D Truy vấn giá trị của bin biểu đồ. float QueryHistValue_1D(CvHistogram hist, int idx0) hist Histogram idx0, idx1, idx2, idx3 Chỉ số thùng rác idx mảng của các chỉ số #define cvQueryHistValue\_1D( hist, idx0 ) \ cvGetReal1D( (hist)->bins, (idx0) ) 150
#define cvQueryHistValue\_2D( hist, idx0, idx1 ) \ cvGetReal2D( (hist)->bins, (idx0), (idx1) ) #define cvQueryHistValue\_3D( hist, idx0, idx1, idx2 ) \ cvGetReal3D( (hist)->bins, (idx0), (idx1), (idx2) ) #define cvQueryHistValue\_nD( hist, idx ) \ cvGetRealND( (hist)->bins, (idx) ) Các macro tr ả về giá trị của bin quy định của 1D, 2D, 3D, biểu đồ ND. Trong trườ ng hợ p của một biểu đồ thưa thớ t Hàm trả về 0, nếu bin không có mặt trong biểu đồ không có bài mớ i bin đượ c tạo ra. cvReleaseHist Phát hành các bi ểu đồ. void cvReleaseHist( CvHistogram** hist ); hist đúp con trỏ đến biểu đồ phát hành Hàm phát hành (tiêu đề và dữ liệu) biểu đồ. Con trỏ đến biểu đồ xóa bở i Hàm. Nếu *hist con trỏ đã đượ c NULL, Hàm không có gì. cvSetHistBinRanges Thiết lập các giớ i hạn của các thùng biểu đồ. void cvSetHistBinRanges( CvHistogram* hist, float** ranges, int uniform=1 ); hist Histogram ranges mảng của các mảng phạm vi bin, xem cvCreateHist uniform tính đồng nhất cờ , xem cvCreateHist Hàm là một Hàm độc l ập để thiết l ập phạm vi bin trong biểu đồ. Cho biết thêm một mô tả chi tiết ranges các thông s ố và uniform xem Hàm cvCalcHist, có th ể khở i tạo các phạm vi như. Phạm vi cho các thùng bi ểu đồ phải đượ c thiết lập trướ c khi biểu đồ đượ c tính hoặc backproject c ủa biểu đồ đượ c tính toán. cvThreshHist Ngưỡ ng biểu đồ. void cvThreshHist( CvHistogram* hist, double threshold ); hist con trỏ đến biểu đồ threshold Cấp ngưỡ ng Hàm xóa các thùng bi ểu đồ dướ i ngưỡ ng quy định.
151
Chươ ng 3: cvaux. Các hàm m ở rộng của Thị Giác Máy Tính 3.1 Phát hiện và mô t ả đối tượ ng
152
Chươ ng 4: highgui. Cao c ấp giao diện và I/O Trong khi OpenCV đượ c thiết kế để sử dụng trong các ứng dụng quy mô đầy đủ và có thể đượ c sử dụng trong phạm vi Hàm giàu khuôn khổ giao diện ngườ i dùng (chẳng hạn như Qt, WinForms hoặc ca cao) ho ặc không có bất kỳ giao diện ngườ i dùng ở tất cả, đôi khi có một cần ph ải th ử một s ố Hàm một cách nhanh chóng và hiển th ị các kết quả. Đây là những gì các mô-đun HighGUI đã đượ c thiết kế cho. Nó cung cấp giao diện dễ dàng để: Tạo ra và thao tác các c ửa sổ có thể hiển thị hình ảnh và "nhớ " nội dung của họ (không có cần phải xử lý sơ n lại các sự kiện từ hệ điều hành) Thêm trackbars các c ửa s ổ, x ử lý các sự kiện chuột đơ n gi ản c ũng như commmands bàn phím Đọc và ghi các hình ảnh đến / từ ổ đĩ a hoặc bộ nhớ . Đọc video từ máy ảnh hoặc tập tin và ghi video vào m ột tập tin. •
•
• •
4.1 Giao diện ngườ i dùng cvConvertImage Chuyển đổi một hình ảnh khác vớ i một lật dọc tùy chọn. void cvConvertImage( const CvArr* src, CvArr* dst, int flags=0 ); src Nguồn hình ảnh. dst Điểm đến hình ảnh. Phải là một kênh hoặc 3-kênh 8-bit hình ảnh. flags Các cờ hoạt động: CV_CVTIMG_FLIP_lật các hình ảnh theo chiều dọc CV_CVTIMG_SWAP_RB Hoán đổi các kênh màu đỏ và màu xanh. Trong hình ảnh màu sắc OpenCV BGR kênh tự, tuy nhiên trên một số hệ thống trật tự cần phải đượ c đảo ngượ c trướ c khi hiển thị hình ảnh (ShowImage làm điều này tự động). CvConvertImage Hàm chuyển đổi một hình ảnh khác và làm b ật kết quả theo chiều dọc nếu mong muốn. Hàm đượ c sử dụng bở i ShowImage. cvCreateTrackbar Tạo ra một trackbar và gắn nó vào cửa sổ chỉ định int cvCreateTrackbar( const char* trackbarName, const char* windowName, int* value, int count, CvTrackbarCallback onChange ); trackbarName Tên c ủa trackbar đượ c tạo ra. windowName Tên của cửa sổ sẽ đượ c sử dụng như một phụ huynh cho trackbar t ạo ra. 153
value con trỏ đến một biến số nguyên, có giá trị sẽ phản ánh vị trí của thanh trượ t. Khi sáng tạo, vị trí thanh trượ t đượ c xác định bở i biến này. count vị trí tối đa của thanh trượ t. Tối thiểu vị trí luôn luôn là 0. onChange Pointer Hàm để đượ c g ọi là mỗi khi thay đổi vị trí thanh trượ t. Hàm này nên đượ c prototyped như void Foo(int); có thể đượ c NULL nếu gọi lại là không cần thiết. CvCreateTrackbar Hàm t ạo ra một (hay còn gọi là thanh trượ t hoặc phạm vi kiểm soát) trackbar vớ i quy định tên và phạm vi, chỉ định một biến đượ c syncronized vớ i trackbar vị trí và Specidoanh nghiệp FDI một Hàm gọi lại đượ c gọi là thay đổi vị trí trackbar. Trackbar t ạo ra đượ c hiển thị trên đỉnh của cửa sổ. CV_EXTERN_C_FUNCPTR( void (*CvTrackbarCallback)(int pos) ); cvDestroyAllWindows Phá hủy tất cả các cửa sổ HighGUI. void cvDestroyAllWindows(void); CvDestroyAllWindows Hàm phá hủy tất cả các HighGUI cửa sổ mở . cvDestroyWindow Phá hủy một cửa sổ. void cvDestroyWindow( const char* name ); name Tên c ủa cửa sổ bị phá hủy. CvDestroyWindow Hàm phá hủy các cửa sổ vớ i tên gọi. cvGetTrackbarPos Trả về vị trí trackbar. int cvGetTrackbarPos( const char* trackbarName, const char* windowName ); trackbarName Tên c ủa trackbar. windowName Tên của cửa sổ đó là cha mẹ của trackbar. CvGetTrackbarPos Hàm trả về vị trí hiện tại của các trackbar quy định. cvGetWindowHandle Đượ c xử lý của cửa sổ theo tên của nó. void* cvGetWindowHandle( const char* name ); name tên c ủa cửa sổ. Các cvGetWindowHandle Hàm tr ả về cửa s ổ xử lý bản địa (HWND trong trườ ng hợ p Win32 và GtkWidget trong trườ ng hợ p của GTK+). cvGetWindowName Lấy tên của cửa sổ bằng cách xử lý của nó. 154
const char* cvGetWindowName( void* windowHandle ); windowHandle Handle của cửa sổ. CvGetWindowName Hàm trả về tên của cửa sổ xử lý nguồn gốc của nó (HWND trong trườ ng hợ p của Win32 và GtkWidget trong tr ườ ng hợ p của GTK +). cvInitSystem Khở i tạo HighGUI. int cvInitSystem( int argc, char** argv ); argc Số của các đối số dòng lệnh argv mảng của các đối số dòng lệnh CvInitSystem Hàm khở i t ạo HighGUI. Nếu nó không đượ c g ọi một cách rõ ràng b ở i ngườ i s ử dụng trướ c khi cửa s ổ đầu tiên đượ c t ạo ra, nó đượ c g ọi là ngầm sau đó v ớ i argc = 0, argv = NULL. Dướ i Win32 không có c ần phải gọi nó một cách rõ ràng. Theo X Window các đối số có thể đượ c sử dụng để tùy chỉnh một nhìn của HighGUI cửa sổ và kiểm soát. cvMoveWindow Thiết lập vị trí của cửa sổ. void cvMoveWindow( const char* name, int x, int y ); name tên c ủa cửa sổ để đượ c di chuyển. x x phối hợ p của các góc trên cùng, bên trái y y phối hợ p của các góc trên cùng, bên trái CvMoveWindow Hàm thay đổi vị trí của cửa sổ. cvNamedWindow Tạo một cửa sổ. int cvNamedWindow( const char* name, int flags ); name tên c ủa cửa sổ trong cửa sổ chú thích có thể đượ c sử dụng như một định danh cửa sổ. flags cờ của cửa sổ. Hiện nay, lá c ờ duy nhất đượ c hỗ trợ là CV_WINDOW_AUTOSIZE. Nếu đây là thiết lập, kích thướ c cửa s ổ đượ c tự động điều chỉnh để phù hợ p vớ i hình ảnh hiển thị (xem ShowImage), và ng ườ i dùng không thể thay đổi kích thướ c cửa sổ bằng tay. CvNamedWindow Hàm tạo ra một c ửa s ổ mà có thể đượ c s ử dụng như một trình giữ chỗ cho lứa tuổi và trackbars. C ửa sổ tạo ra đượ c gọi bằng tên của họ. Nếu một cửa sổ vớ i cùng tên đã tồn tại, Hàm không có gì. cvResizeWindow Thiết lập kích thướ c cửa sổ. void cvResizeWindow( const char* name, int width, int height ); name tên c ủa cửa sổ để thay đổi kích cỡ . width chiều rộng height chiều cao 155
CvResizeWindow Hàm thay đổi kích thướ c của cửa sổ. cvSetMouseCallback Gán gọi lại cho các s ự kiện chuột. void cvSetMouseCallback( const char* windowName, CvMouseCallback onMouse, void* param=NULL ); windowName Tên của cửa sổ. onMouse con trỏ đến các Hàm để đượ c g ọi là mỗi khi một sự kiện chuột xảy ra trong các quy định cửa sổ. Hàm này nên đượ c prototyped như void Foo(int event, int x, int y, int flags, void* param); nơ i event là m ột trong CV_EVENT_*, x và y là đồng phối c ủa con trỏ chuột trong hệ tọa độ hình ảnh (không phải cửa sổ tọa độ), flags là một sự kết hợ p của CV_EVENT_FLAG_*, và param là ngườ i dùng định ngh ĩ a tham số đượ c truyền cho các cvSetMouseCallback Hàm cu ộc gọi. param ngườ i sử dụng xác định tham số đượ c thông qua vớ i Hàm gọi lại. CvSetMouseCallback Hàm thiết lập các Hàm g ọi lại cho các s ự kiện chuột xảy ra trong cửa sổ chỉ định. Tham số sự kiện là một trong những: CV_EVENT_MOUSEMOVE chuột phong trào CV_EVENT_LBUTTONDOWN lại nút xuống CV_EVENT_RBUTTONDOWN phải xuống CV_EVENT_MBUTTONDOWN Trung nút xuống CV_EVENT_LBUTTONUP lại nút lên CV_EVENT_RBUTTONUP phải nút lên CV_EVENT_MBUTTONUP Trung nút lên CV_EVENT_LBUTTONDBLCLK Còn lại bấm vào nút tăng gấp đôi CV_EVENT_RBUTTONDBLCLK nút phải nhấn đúp chuột CV_EVENT_MBUTTONDBLCLK Trung nút nhấp đúp chuột vào Các tham s ố flags là một sự kết hợ p của: CV_EVENT_FLAG_LBUTTON trái nút nhấn CV_EVENT_FLAG_RBUTTON phải nút nhấn CV_EVENT_FLAG_MBUTTON Trung nút nhấn CV_EVENT_FLAG_CTRLKEY điều khiển phím nhấn CV_EVENT_FLAG_SHIFTKEY phím Shift ép CV_EVENT_FLAG_ALTKEY Alt phím đượ c nhấn cvSetTrackbarPos Thiết lập vị trí trackbar. void cvSetTrackbarPos( const char* trackbarName, const char* windowName, int pos ); 156
trackbarName Tên c ủa trackbar. windowName Tên của cửa sổ đó là mẹ của trackbar. pos vị trí mớ i. CvSetTrackbarPos Hàm thiết lập vị trí của các trackbar quy định. cvShowImage Hiển thị hình ảnh trong cửa sổ chỉ định void cvShowImage( const char* name, const CvArr* image ); name tên c ủa cửa sổ. image hình ảnh đượ c hiển thị. CvShowImage Hàm hiển thị hình ảnh trong cửa sổ chỉ định. Nếu cửa sổ đượ c tạo ra vớ i cờ CV WINDOW AUTOSIZE sau đó hình ảnh đượ c hiển thị vớ i kích thướ c ban đầu của nó, khôn ngoan là hình ảnh thu nhỏ để phù hợ p vớ i cửa sổ. Hàm có thể quy mô hình ảnh, tùy thuộc vào của nó sâu: Nếu hình ảnh 8-bit không dấu, nó đượ c hiển thị như là. Nếu hình ảnh là 16-bit số nguyên không dấu 32-bit, các điểm ảnh đượ c chia cho 256. Đó là, phạm vi giá trị [0255 * 256] đượ c ánh xạ tớ i [0255]. Nếu hình ảnh là 32-bit floating-point, các giá tr ị pixel đượ c nhân vớ i 255. Đó là, giá tr ị phạm vi [0,1] là ánh xạ tớ i [0255]. cvWaitKey Chờ đợ i cho một phím đượ c nhấn. int cvWaitKey( int delay=0 ); delay dừng trong mili giây. CvWaitKey Hàm chờ đợ i cho sự kiện quan trọng vô hạn (delay<= 0) hoặc delay phần nghìn giây. Trả về mã của phím đượ c nhấn hoặc -1 nếu không có phím nào đượ c nhấn trướ c khi thờ i gian quy định trôi qua. Lưu ý: Hàm này là ph ươ ng pháp duy nhất trong HighGUI có th ể lấy và xử lý các sự kiện, vì vậy nó cần đượ c gọi là định kỳ cho xử lý sự kiện bình thườ ng, trừ khi HighGUI đượ c sử dụng trong một số môi trườ ng chăm sóc xử lý sự kiện.
4.2 Đọc / ghi hình ảnh và video cvLoadImage Tải một hình ảnh từ một tập tin như một IplImage. IplImage* cvLoadImage( const char* filename, int iscolor=CV LOAD IMAGE COLOR ); filename tin Tên c ủa tập tin để đượ c nạp. iscolor loại màu sắc cụ thể của hình ảnh đượ c tải: 157
CV_LOAD_IMAGE_COLOR các hình ảnh đượ c t ải buộc ph ải là một hình ảnh 3-kênh màu CV_LOAD_IMAGE_GRAYSCALE hình ảnh đượ c tải buộc phải là màu xám CV_LOAD_IMAGE_UNCHANGED hình ảnh đượ c tải sẽ đượ c nạp như là. CvLoadImage Hàm t ải hình ảnh từ các tập tin đượ c chỉ định và trả về con trỏ đến hình ảnh đượ c tải. Hiện tại, định dạng tập tin sau đây đượ c hỗ trợ : · Windows bitmap - BMP, DIB . JPEG file JPEG, JPG, JPE · Thiết bị đồ họa - PNG · Thiết bị hình ảnh định dạng - PBM, PGM, PPM . Sun rasters - SR, RAS . TIFF file TIFF, TIF Lưu ý rằng trong việc thực hiện hiện tại, các kênh alpha, n ếu có, đượ c tướ c từ đầu ra hình ảnh, ví dụ: 4-kênh hình ảnh RGBA sẽ đượ c nạp là RGB. cvLoadImageM Tải một hình ảnh từ một tập tin như một CvMat. CvMat* cvLoadImageM( const char* filename, int iscolor=CV LOAD IMAGE COLOR ); filename Tên c ủa tập tin để đượ c nạp. iscolor loại màu sắc cụ thể của hình ảnh đượ c tải: CV_LOAD_IMAGE_COLOR các hình ảnh đượ c t ải buộc ph ải là một hình ảnh 3-kênh màu CV_LOAD_IMAGE_GRAYSCALE hình ảnh đượ c tải buộc phải là màu xám CV_LOAD_IMAGE_UNCHANGED hình ảnh đượ c tải sẽ đượ c nạp như là. CvLoadImageM Hàm tải hình ảnh từ các tập tin đượ c chỉ định và trả về con trỏ hình ảnh đượ c tải. urrently các định dạng tập tin sau đây đượ c hỗ trợ : · Windows bitmap - BMP, DIB . JPEG file JPEG, JPG, JPE · Thiết bị đồ họa - PNG · Thiết bị hình ảnh định dạng - PBM, PGM, PPM . Sun rasters - SR, RAS . TIFF file TIFF, TIF Lưu ý rằng trong việc thực hiện hiện tại, các kênh alpha, n ếu có, đượ c tướ c từ đầu ra hình ảnh, ví dụ: 4-kênh hình ảnh RGBA sẽ đượ c nạp là RGB. cvSaveImage Tiết kiệm một hình ảnh vào một tập tin đượ c chỉ định. int cvSaveImage( const char* filename, const CvArr* image ); filename Tên c ủa tập tin. 158
image hình ảnh đượ c lưu lại. CvSaveImage Hàm l ưu lại hình ảnh các tập tin đượ c chỉ định. Các định dạng hình ảnh đượ c chọn dựa trên phần mở rộng filename, xem LoadImage. Ch ỉ có duy nhất 8-bit kênh, 3 kênh (vớ i BGR 'kênh theo thứ tự) hình ảnh có thể đượ c l ưu bằng cách sử dụng Hàm này. Nếu định dạng, độ sâu hoặc kênh thứ tự là khác nhau, sử dụng cvCvtScale và cvCvtColor để chuyển đổi nó trướ c khi lưu, hoặc sử dụng phổ quát cvSave để lưu các hình ảnh định dạng XML hoặc YAML. CvCapture Quay video cấu trúc. typedef struct CvCapture CvCapture; Các CvCapture cấu trúc không có một giao diện công chúng và ch ỉ đượ c sử dụng như một tham số cho các Hàm quay video. cvCaptureFromCAM Khở i tạo thu giữ một đoạn video từ máy ảnh. CvCapture* cvCaptureFromCAM( int index ); index chỉ số của máy ảnh đượ c sử dụng. Nếu ch ỉ có một máy ảnh hoặc nó không có vấn đề gì máy ảnh đượ c sử dụng -1 có thể đượ c thông qua. CvCaptureFromCAM Hàm phân bổ và khở i tạo cấu trúc CvCapture đọc hình ảnh video từ máy ảnh. Hiện nay, hai giao di ện máy ảnh có thể đượ c sử dụng trên Windows: Video cho Windows (VFW) và hình ảnh Thư viện Matrox (MIL) và hai trên Linux: V4L và FireWire (IEEE1394). Để phát hành cấu trúc, sử dụng ReleaseCapture. cvCaptureFromFile Khở i tạo thu giữ một đoạn video từ một tập tin. CvCapture* cvCaptureFromFile( const char* filename ); filename Tên c ủa file video. CvCaptureFromFile Hàm phân b ổ và khở i t ạo các cấu trúc CvCapture để đọc các dòng video từ các tập tin đượ c chỉ định. Codec và các định dạng file đượ c hỗ trợ phụ thuộc thư viện kết thúc trở lại. Ngày của Windows HighGui sử dụng video cho Windows (VFW), trên Linux ffmpeg đượ c sử dụng và trên Mac OS X k ết thúc trở lại QuickTime. Xem VideoCodecs đối vớ i một số thảo luận về những gì mong đợ i và làm thế nào để chuẩn bị các tập tin video của bạn. Sau khi cơ cấu phân bổ không đượ c sử dụng nữa, nó nên đượ c phát hành bở i các ReleaseCapture Hàm. cvGetCaptureProperty Đượ c tính chất quay video. double cvGetCaptureProperty( CvCapture* capture, int property id ); capture cấu trúc quay video. 159
property_id tài sản sở hữu. Có thể một trong những điều sau đây: CV_CAP_PROP_POS_MSEC mili giây Phim vị trí hiện tại trong mili giây hoặc dấu thờ i gian quay video CV_CAP_PROP_POS_FRAMES 0-dựa trên chỉ số của khung hình để đượ c giải mã / bắt tiếp theo CV_CAP_PROP_POS_AVI_RATIO tươ ng đối v ị trí của file video (0 - b ắt đầu c ủa b ộ phim, 1 kết thúc của bộ phim) CV_CAP_PROP_FRAME_WIDTH Chiều rộng của khung hình trong dòng video CV_CAP_PROP_FRAME_HEIGHT Chiều cao của khung hình trong dòng video CV_CAP_PROP_FPS Frame rate CV_CAP_PROP_FOURCC 4-mã ký tự của các codec CV_CAP_PROP_FRAME_COUNT Số khung hình trong các file video CV_CAP_PROP_BRIGHTNESS độ sáng của hình ảnh (chỉ dành cho máy ảnh) CV_CAP_PROP_CONTRAST tươ ng phản của hình ảnh (chỉ dành cho máy ảnh) CV_CAP_PROP_SATURATION độ bão hòa của hình ảnh (chỉ dành cho máy ảnh) CV_CAP_PROP_HUE HUE của hình ảnh (chỉ dành cho máy ảnh) CvGetCaptureProperty Hàm lấy tài sản quy định của máy ảnh hoặc video tập tin. cvGrabFrame Lấy các khung hình từ máy ảnh hoặc tập tin. int cvGrabFrame( CvCapture* capture ); capture cấu trúc quay video. CvGrabFrame Hàm lấy khung hình từ máy ảnh hoặc tập tin. Khung nắm lấy lưu trữ nội bộ. Mục đích của Hàm này là để lấy khung hình một cách nhanh chóng để syncronization có th ể xảy ra nếu nó có để đọc từ một s ố máy ảnh cùng một lúc. Các khung hình n ắm lấy không tiếp xúc bở i vì họ có thể đượ c l ưu tr ữ trong một định d ạng nén (như đượ c định ngh ĩ a b ở i các máy ảnh / driver). Để lấy khung nắm lấy, RetrieveFrame nên đượ c sử dụng. cvQueryFrame Lấy và trả về một khung hình từ máy ảnh hoặc tập tin. IplImage* cvQueryFrame( CvCapture* capture ); capture cấu trúc quay video. CvQueryFrame Hàm lấy một khung hình từ một file máy ảnh hoặc video, giải nén nó và trả về nó. Hàm này chỉ là một sự kết hợ p của GrabFrame và RetrieveFrame, nh ưng trong một cuộc gọi. Những hình ảnh trở về không nên đượ c phát hành hoặc sửa đổi b ở i ngườ i sử dụng. Trong trườ ng hợ p lỗi, trả lại giá trị có thể đượ c NULL. cvReleaseCapture Phát hành các c ấu trúc CvCapture. void cvReleaseCapture( CvCapture** capture ); capture con trỏ cấu trúc chụp video. 160
Hàm cvReleaseCapture phát hành c ấu trúc CvCapture giao CaptureFromFile ho ặc CaptureFromCAM. cvRetrieveFrame Đượ c các hình ảnh chụp lấy vớ i cvGrabFrame. IplImage* cvRetrieveFrame( CvCapture* capture ); capture cấu trúc quay video. CvRetrieveFrame Hàm tr ả về con trỏ đến hình ảnh n ắm l ấy vớ i GrabFrame Hàm. Những hình ảnh trở về không nên đượ c phát hành hoặc s ửa đổi b ở i ngườ i sử dụng. Trong trườ ng h ợ p của một lỗi, giá trị trả về có thể là NULL. cvSetCaptureProperty Thiết lập thuộc tính quay video. int cvSetCaptureProperty( CvCapture* capture, int property id, double value ); capture cấu trúc quay video. property_id tài sản sở hữu. Có thể một trong những điều sau đây: CV_CAP_PROP_POS_MSEC mili giây Phim vị trí hiện tại trong mili giây hoặc dấu thờ i gian quay video CV_CAP_PROP_POS_FRAMES 0-dựa trên chỉ số của khung hình để đượ c giải mã / bắt tiếp theo CV_CAP_PROP_POS_AVI_RATIO tươ ng đối v ị trí của file video (0 - b ắt đầu c ủa b ộ phim, 1 kết thúc của bộ phim) CV_CAP_PROP_FRAME_WIDTH Chiều rộng của khung hình trong dòng video CV_CAP_PROP_FRAME_HEIGHT Chiều cao của khung hình trong dòng video CV_CAP_PROP_FPS Frame rate CV_CAP_PROP_FOURCC 4-mã ký tự của các codec CV_CAP_PROP_BRIGHTNESS độ sáng của hình ảnh (chỉ dành cho máy ảnh) CV_CAP_PROP_CONTRAST tươ ng phản của hình ảnh (chỉ dành cho máy ảnh) CV_CAP_PROP_SATURATION độ bão hòa của hình ảnh (chỉ dành cho máy ảnh) CV_CAP_PROP_HUE HUE của hình ảnh (chỉ dành cho máy ảnh) value giá trị của tài sản. CvSetCaptureProperty Hàm thiết lập các tài sản quy định thu video. Currently Hàm hỗ trợ các file video chỉ: CV_CAP_PROP_POS_MSEC , CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIO. NB Hàm này hiện đang không làm gì khi s ử dụng tải về CVS mớ i nhất trên Linux FFMPEG (các nội dung Hàm ẩn nếu 0 đượ c sử dụng và trả lại). cvCreateVideoWriter 161
Tạo ra các nhà văn tập tin video. typedef struct CvVideoWriter CvVideoWriter; CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame size, int is color=1 ); filename Tên c ủa các t ập tin video đầu ra. fourcc 4-mã ký tự của các codec đượ c sử dụng để nén các khung hình. Ví d ụ, CV_FOURCC ('P', 'I', 'M', '1') là một MPEG-1 codec, CV FOURCC ('M', 'J', 'P', 'G') là một chuyển động-jpeg mã hóa ... Theo Win32 có th ể vượ t qua -1 để lựa chọn phươ ng pháp nén và thêm compression các thông số từ hộp thoại. Dướ i Win32, nếu 0 đượ c thông qua trong khi sử dụng một tên tập tin avi nó sẽ tạo ra một nhà văn video tạo ra một file avi không nén. fps khung hình của các dòng video t ạo ra. frame_size kích th ướ c của khung hình video. is_color Nếu nó không phải là không, các bộ mã hóa sẽ mong đợ i và mã hóa các khung màu, nếu không nó sẽ làm việc v ớ i màu xám khung (lá c ờ hiện đang đượ c h ỗ trợ trên chỉ dành cho Windows). CvCreateVideoWriter Hàm tạo ra các cấu trúc nhà văn video. Codec và các định dạng file đượ c hỗ trợ phụ thuộc vào các thư viện kết thúc trở lại. Trên Windows HighGui sử dụng Video cho Windows (VFW), trên Linux ffmpeg đượ c sử dụng và trên Mac OS X k ết thúc trở lại là QuickTime. Xem VideoCodecs đối v ớ i m ột s ố thảo lu ận về những gì mong đợ i. cvReleaseVideoWriter Phát hành các nhà v ăn AVI. void cvReleaseVideoWriter( CvVideoWriter** writer ); writer Pointer cấu trúc nhà văn tập tin video. CvReleaseVideoWriter Hàm kết thúc bằng văn bản cho tập tin video và phát hành, cấu truc. cvWriteFrame Viết một khung vào một tập tin video. int cvWriteFrame( CvVideoWriter* writer, const IplImage* image ); writer Video của cấu trúc image Khung bằng văn bản CvWriteFrame Hàm vi ết / gắn thêm một khung hình vào một tập tin video.
162