tôi đã tạo ra một DLL nơi người dùng có thể hoặc là đọc một hình ảnh từ một tên tập tin hoặc từ một dòng như sau:Có cách nào khác để sử dụng mã imdecode của OpenCV không? Đó là quá chậm
std::string filePath = "SomeImage.bmp";
// (1) Reading from a file
Image2D img1;
img1.readImage(filePath);
// (2) Reading from a stream
std::ifstream imgStream (filePath.c_str(), std::ios::binary);
Image2D img2;
img2.readImage(imgStream);
Đầu tiên readImage(filePath)
được thực hiện sử dụng cv::imread(filePath)
đó là hợp lý nhanh (trên trung bình 0,001 giây cho hình ảnh 600 x 900). Tuy nhiên, phiên bản thứ hai readImage(fileStream)
được triển khai bằng cách sử dụng cv::imdecode
là chậm hơn đáng kể (trung bình 2,5 giây cho cùng một hình ảnh).
Có lựa chọn thay thế nào cho cv::imdecode
nơi tôi có thể giải mã hình ảnh từ bộ nhớ đệm mà không mất một thời gian dài như vậy không? Điều này là dành cho thành phần cốt lõi của một ứng dụng thường được sử dụng, vì vậy nó phải nhanh chóng.
Mọi hỗ trợ sẽ được đánh giá cao. Cảm ơn trước.
EDIT:
Tôi đo thời gian bằng bộ hẹn giờ. Nó không có ý nghĩa với tôi nữa. Tôi không hiểu tại sao có một sự chênh lệch lớn như vậy trong thời gian đó. Image2D
chỉ là một lớp có ma trận OpenCV làm thành viên. Việc thực hiện các chức năng readImage
được đơn giản hóa như sau:
int Image2D::readImage(std::ifstream& input)
{
input.seekg(0, std::ios::end);
size_t fileSize = input.tellg();
input.seekg(0, std::ios::beg);
if (fileSize == 0) {
return 1;
}
std::vector<unsigned char> data(fileSize);
input.read(reinterpret_cast<char*>(&data[0]), sizeof(unsigned char) * fileSize);
if (!input) {
return 1;
}
StopWatch stopWatch;
mImg = cv::imdecode(cv::Mat(data), CV_LOAD_IMAGE_COLOR);
std::cout << "Time to decode: " << stopWatch.getElapsedTime() << std::endl;
return 0;
}
int Image2D::readImage(const std::string& fileName)
{
StopWatch stopWatch;
mImg = cv::imread(fileName, CV_LOAD_IMAGE_COLOR);
std::cout << "Time to read image: " << stopWatch.getElapsedTime() << std::endl;
return 0;
}
Bạn đo thời gian như thế nào? Điều này dường như không có ý nghĩa nhiều: 'imread' sử dụng' imdecode' trong nội bộ, và bạn chỉ đọc một tệp bitmap mà thực sự không có giải mã chút nào. Bạn cũng nên hiển thị mã cho lớp của bạn 'Image2D' và phương thức' readImage' implementation (2 tùy chọn bị quá tải). – Antonio
Xem các chỉnh sửa của tôi @Antonio. – Duncs
đồng hồ bấm giờ đó được triển khai như thế nào? kể từ khi bạn đầu tiên đo lường imread, có thể một số loại singleton của nó và không tái định cư? – Micka