Để hiểu những gì đang xảy ra bạn cần phải có một cái nhìn tại C++ constructors, cụ thể các copy constructor hơn.
Khi bạn tạo một cv::Mat
từ cv::Mat
khác, như trong:
cv::Mat a = cv::imread("huge.png", 1);
cv::Mat b = a;
các copy constructor (mà là một chức năng) của cv::Mat
được gọi để thực hiện các bản sao của đối tượng. Trước khi tôi nói về những gì xảy ra trong quy trình sao chép, bạn phải nhận ra rằng vì cv::Mat
được sử dụng để lưu trữ hình ảnh, hình ảnh lớn hơn có thể chiếm hàng trăm MB trong bộ nhớ. Vì vậy, công cụ sao chép sao chép của cv::Mat
trong ví dụ trên là sao chép toàn bộ tiêu đề (chiều cao, chiều rộng, thông tin chiều sâu và các phần khác) của a
vào b
, nhưng thay vì sao chép toàn bộ dữ liệu/pixel của a
(có thể là hàng trăm của MB), nó chỉ trỏ (sử dụng một con trỏ) đến dữ liệu gốc của a
.
Nói cách khác, không sao chép toàn bộ dữ liệu hình ảnh là quyết định tối ưu hóa/hiệu suất.
Bây giờ, hãy xem xét mã này mà các cuộc gọi một chức năng và vượt qua cv::Mat
như một tham số:
void do_something(cv::Mat src)
{
// changing src pixels will be the same as changing orig pixels
}
int main()
{
cv::Mat orig = cv::imread("huge.png", 1);
do_something(orig);
return 0;
}
Nếu bạn đã nghiên cứu làm thế nào để vượt qua các thông số chức năng, bạn biết rằng gọi do_something(a);
sẽ pass the parameter by value. Điều này có nghĩa là nó sẽ cố gắng sao chép nội dung của orig
vào src
, tuy nhiên, quy trình này kích hoạt trình tạo bản sao của cv::Mat
mà sẽ không tạo bản sao dữ liệu cứng như tôi vừa giải thích.
Giải pháp cho vấn đề này? Nếu bạn đang viết do_something()
và bạn chỉ muốn tạo một bản sao thực sự của orig
, chỉ cần tạo một mới cv::Mat
và gọi phương thức copyTo()
:
void do_something(cv::Mat src)
{
cv::Mat real_copy = src.copyTo();
// operating on the data of real_copy will not affect orig
}
Nhưng hãy nhớ, nếu src
là ~ 100MB gọi copyTo()
để làm cho bản sao thực sẽ chiếm một ~ 100MB bộ nhớ khác, điều đó có nghĩa là trong một hàm duy nhất gọi chương trình của bạn chỉ cần đi từ 100MB đến 200MB.Hãy ghi nhớ điều này khi thiết kế hệ thống của bạn. Chúc may mắn.
Các địa điểm này ở đâu? Bạn có thể chia sẻ tài liệu tham khảo cho họ không? – karlphillip
http://opencv.willowgarage.com/documentation/cpp/memory_management.html –