Skip to content

Commit 571f9c9

Browse files
committed
use oepncv to reduce save time.
1 parent 2355b2a commit 571f9c9

File tree

14 files changed

+192
-16
lines changed

14 files changed

+192
-16
lines changed

RealSR-NCNN-Android-CLI/RealCUGAN/src/main/jni/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ include_directories(${ncnn_DIR}/${ANDROID_ABI}/include/ncnn)
1515
set_target_properties(ncnn PROPERTIES IMPORTED_LOCATION
1616
${ncnn_DIR}/${ANDROID_ABI}/lib/libncnn.so)
1717

18+
set(OpenCV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../3rdparty/OpenCV-android-sdk/sdk/native/jni/)
19+
find_package(OpenCV REQUIRED)
20+
include_directories(${OpenCV_DIR}/include)
1821

1922
#include_directories(${CMAKE_CURRENT_BINARY_DIR})
2023
option(USE_SYSTEM_WEBP "build with system libwebp" OFF)
@@ -44,4 +47,4 @@ endif()
4447

4548
add_executable(realcugan-ncnn main.cpp realcugan.cpp)
4649

47-
target_link_libraries(realcugan-ncnn webp ncnn)
50+
target_link_libraries(realcugan-ncnn webp ncnn ${OpenCV_LIBS})

RealSR-NCNN-Android-CLI/RealCUGAN/src/main/jni/main.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ static std::vector<int> parse_optarg_int_array(const char* optarg)
9797
#include "realcugan.h"
9898

9999
#include "filesystem_utils.h"
100+
#include <opencv2/opencv.hpp>
101+
#include <opencv2/core/hal/interface.h>
102+
using namespace cv;
100103

101104
static void print_usage()
102105
{
@@ -389,7 +392,31 @@ void* save(void* args)
389392

390393
path_t ext = get_file_extension(v.outpath);
391394

392-
if (ext == PATHSTR("webp") || ext == PATHSTR("WEBP"))
395+
if (ext != PATHSTR("gif")) {
396+
// 使用opencv保存图片,速度比默认的stb更快
397+
cv::Mat image;
398+
switch (v.outimage.elempack) {
399+
case 1:
400+
image = cv::Mat( v.outimage.h, v.outimage.w, CV_8UC1, v.outimage.data); // 单通道图像
401+
break;
402+
case 3:
403+
image = cv::Mat(v.outimage.h, v.outimage.w, CV_8UC3, v.outimage.data); // 3通道图像
404+
cv::cvtColor(image, image, cv::COLOR_RGB2BGR);
405+
break;
406+
case 4:
407+
image = cv::Mat(v.outimage.h, v.outimage.w, CV_8UC4, v.outimage.data); // 4通道图像
408+
cv::cvtColor(image, image, cv::COLOR_RGBA2BGRA);
409+
break;
410+
}
411+
if (image.empty()) {
412+
std::cerr << "Error: Image data not loaded." << std::endl;
413+
success = false;
414+
} else {
415+
success = imwrite(v.outpath.c_str(), image);
416+
}
417+
418+
419+
}else if (ext == PATHSTR("webp") || ext == PATHSTR("WEBP"))
393420
{
394421
success = webp_save(v.outpath.c_str(), v.outimage.w, v.outimage.h, v.outimage.elempack, (const unsigned char*)v.outimage.data);
395422
}

RealSR-NCNN-Android-CLI/RealSR/src/main/jni/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ set_target_properties(ncnn PROPERTIES IMPORTED_LOCATION
1616
${ncnn_DIR}/${ANDROID_ABI}/lib/libncnn.so)
1717

1818

19+
set(OpenCV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../3rdparty/OpenCV-android-sdk/sdk/native/jni/)
20+
find_package(OpenCV REQUIRED)
21+
include_directories(${OpenCV_DIR}/include)
22+
1923
#include_directories(${CMAKE_CURRENT_BINARY_DIR})
2024
option(USE_SYSTEM_WEBP "build with system libwebp" OFF)
2125
if(NOT USE_SYSTEM_WEBP)
@@ -48,4 +52,4 @@ add_executable(realsr-ncnn
4852
realsr.cpp
4953
)
5054

51-
target_link_libraries(realsr-ncnn webp ncnn)
55+
target_link_libraries(realsr-ncnn webp ncnn ${OpenCV_LIBS})

RealSR-NCNN-Android-CLI/RealSR/src/main/jni/main.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ static std::vector<int> parse_optarg_int_array(const char *optarg) {
108108
#include "realsr.h"
109109

110110
#include "filesystem_utils.h"
111+
#include <opencv2/opencv.hpp>
112+
#include <opencv2/core/hal/interface.h>
113+
using namespace cv;
111114

112115
static void print_usage() {
113116
fprintf(stderr, "Usage: realsr-ncnn -i infile -o outfile [options]...\n\n");
@@ -483,7 +486,29 @@ void *save(void *args) {
483486

484487
path_t ext = get_file_extension(v.outpath);
485488

486-
if (ext == PATHSTR("webp") || ext == PATHSTR("WEBP")) {
489+
if (ext != PATHSTR("gif")) {
490+
// 使用opencv保存图片,速度比默认的stb更快
491+
cv::Mat image;
492+
switch (v.outimage.elempack) {
493+
case 1:
494+
image = cv::Mat( v.outimage.h, v.outimage.w, CV_8UC1, v.outimage.data); // 单通道图像
495+
break;
496+
case 3:
497+
image = cv::Mat(v.outimage.h, v.outimage.w, CV_8UC3, v.outimage.data); // 3通道图像
498+
cv::cvtColor(image, image, cv::COLOR_RGB2BGR);
499+
break;
500+
case 4:
501+
image = cv::Mat(v.outimage.h, v.outimage.w, CV_8UC4, v.outimage.data); // 4通道图像
502+
cv::cvtColor(image, image, cv::COLOR_RGBA2BGRA);
503+
break;
504+
}
505+
if (image.empty()) {
506+
std::cerr << "Error: Image data not loaded." << std::endl;
507+
success = false;
508+
} else {
509+
success = imwrite(v.outpath.c_str(), image);
510+
}
511+
}else if (ext == PATHSTR("webp") || ext == PATHSTR("WEBP")) {
487512
success = webp_save(v.outpath.c_str(), v.outimage.w, v.outimage.h, v.outimage.elempack,
488513
(const unsigned char *) v.outimage.data);
489514
} else if (ext == PATHSTR("png") || ext == PATHSTR("PNG")) {

RealSR-NCNN-Android-CLI/Resize/src/main/jni/CMakeLists.txt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ if (WIN32)
1616
endif ()
1717

1818
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../Lib/valkan/Include)
19-
2019
set(ncnn_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../3rdparty/ncnn-windows-vs2019-shared)
2120

2221
add_library(ncnn SHARED IMPORTED)
@@ -25,11 +24,16 @@ if (WIN32)
2524
${ncnn_DIR}/${TARG_CPU}/lib/ncnn.lib)
2625
else ()
2726
set(ncnn_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../3rdparty/ncnn-android-vulkan-shared)
28-
2927
add_library(ncnn SHARED IMPORTED)
3028
include_directories(${ncnn_DIR}/${ANDROID_ABI}/include/ncnn)
3129
set_target_properties(ncnn PROPERTIES IMPORTED_LOCATION
3230
${ncnn_DIR}/${ANDROID_ABI}/lib/libncnn.so)
31+
32+
set(OpenCV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../3rdparty/OpenCV-android-sdk/sdk/native/jni/)
33+
34+
find_package(OpenCV REQUIRED)
35+
include_directories(${OpenCV_DIR}/include)
36+
3337
endif ()
3438
#set(libwebp_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libwebp)
3539
set(libwebp_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../3rdparty/libwebp)
@@ -64,4 +68,8 @@ add_executable(resize-ncnn
6468
main.cpp
6569
)
6670

67-
target_link_libraries(resize-ncnn webp ncnn)
71+
if (WIN32)
72+
target_link_libraries(resize-ncnn webp ncnn)
73+
else ()
74+
target_link_libraries(resize-ncnn webp ncnn ${OpenCV_LIBS})
75+
endif ()

RealSR-NCNN-Android-CLI/Resize/src/main/jni/main.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030

3131
#include "stb_image_write.h"
3232

33+
#include <opencv2/opencv.hpp>
34+
#include <opencv2/core/hal/interface.h>
35+
using namespace cv;
36+
3337
#endif // _WIN32
3438

3539
#include "webp_image.h"
@@ -829,12 +833,38 @@ int main(int argc, char **argv)
829833
high_resolution_clock::time_point save_begin = high_resolution_clock::now();
830834

831835
{
832-
833-
834836
int success = 0;
835837

836838
path_t ext = get_file_extension(imagepath);
837839

840+
#if _WIN32
841+
842+
#else
843+
if (ext != PATHSTR("gif")) {
844+
// 使用opencv保存图片,速度比默认的stb更快
845+
cv::Mat image;
846+
switch (c) {
847+
case 1:
848+
image = cv::Mat( out_h, out_w, CV_8UC1, buf); // 单通道图像
849+
break;
850+
case 3:
851+
image = cv::Mat(out_h, out_w, CV_8UC3, buf); // 3通道图像
852+
cv::cvtColor(image, image, cv::COLOR_RGB2BGR);
853+
break;
854+
case 4:
855+
image = cv::Mat(out_h, out_w, CV_8UC4, buf); // 4通道图像
856+
cv::cvtColor(image, image, cv::COLOR_RGBA2BGRA);
857+
break;
858+
}
859+
if (image.empty()) {
860+
std::cerr << "Error: Image data not loaded." << std::endl;
861+
success = false;
862+
} else {
863+
success = imwrite(outputpath.c_str(), image);
864+
fprintf(stderr, "opencv save image success, c=%d, w=%d, h=%d\n", c, w, h);
865+
}
866+
}else
867+
#endif
838868
if (ext == PATHSTR("webp") || ext == PATHSTR("WEBP")) {
839869
success = webp_save(outputpath.c_str(), out_w, out_h, c, buf);
840870

RealSR-NCNN-Android-CLI/SRMD/src/main/jni/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ set_target_properties(ncnn PROPERTIES IMPORTED_LOCATION
1616
${ncnn_DIR}/${ANDROID_ABI}/lib/libncnn.so)
1717

1818

19+
set(OpenCV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../3rdparty/OpenCV-android-sdk/sdk/native/jni/)
20+
find_package(OpenCV REQUIRED)
21+
include_directories(${OpenCV_DIR}/include)
22+
1923
#include_directories(${CMAKE_CURRENT_BINARY_DIR})
2024
option(USE_SYSTEM_WEBP "build with system libwebp" OFF)
2125
if(NOT USE_SYSTEM_WEBP)
@@ -45,4 +49,4 @@ endif()
4549

4650
add_executable(srmd-ncnn main.cpp srmd.cpp)
4751

48-
target_link_libraries(srmd-ncnn webp ncnn)
52+
target_link_libraries(srmd-ncnn webp ncnn ${OpenCV_LIBS})

RealSR-NCNN-Android-CLI/SRMD/src/main/jni/main.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ static std::vector<int> parse_optarg_int_array(const char* optarg)
9797
#include "srmd.h"
9898

9999
#include "filesystem_utils.h"
100+
#include <opencv2/opencv.hpp>
101+
#include <opencv2/core/hal/interface.h>
102+
using namespace cv;
100103

101104
static void print_usage()
102105
{
@@ -373,7 +376,29 @@ void* save(void* args)
373376

374377
path_t ext = get_file_extension(v.outpath);
375378

376-
if (ext == PATHSTR("webp") || ext == PATHSTR("WEBP"))
379+
if (ext != PATHSTR("gif")) {
380+
// 使用opencv保存图片,速度比默认的stb更快
381+
cv::Mat image;
382+
switch (v.outimage.elempack) {
383+
case 1:
384+
image = cv::Mat( v.outimage.h, v.outimage.w, CV_8UC1, v.outimage.data); // 单通道图像
385+
break;
386+
case 3:
387+
image = cv::Mat(v.outimage.h, v.outimage.w, CV_8UC3, v.outimage.data); // 3通道图像
388+
cv::cvtColor(image, image, cv::COLOR_RGB2BGR);
389+
break;
390+
case 4:
391+
image = cv::Mat(v.outimage.h, v.outimage.w, CV_8UC4, v.outimage.data); // 4通道图像
392+
cv::cvtColor(image, image, cv::COLOR_RGBA2BGRA);
393+
break;
394+
}
395+
if (image.empty()) {
396+
std::cerr << "Error: Image data not loaded." << std::endl;
397+
success = false;
398+
} else {
399+
success = imwrite(v.outpath.c_str(), image);
400+
}
401+
}else if (ext == PATHSTR("webp") || ext == PATHSTR("WEBP"))
377402
{
378403
success = webp_save(v.outpath.c_str(), v.outimage.w, v.outimage.h, v.outimage.elempack, (const unsigned char*)v.outimage.data);
379404
}

RealSR-NCNN-Android-CLI/Waifu2x/src/main/jni/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ set_target_properties(ncnn PROPERTIES IMPORTED_LOCATION
1515
${ncnn_DIR}/${ANDROID_ABI}/lib/libncnn.so)
1616

1717

18+
set(OpenCV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../3rdparty/OpenCV-android-sdk/sdk/native/jni/)
19+
find_package(OpenCV REQUIRED)
20+
include_directories(${OpenCV_DIR}/include)
21+
1822
#include_directories(${CMAKE_CURRENT_BINARY_DIR})
1923
option(USE_SYSTEM_WEBP "build with system libwebp" OFF)
2024
if(NOT USE_SYSTEM_WEBP)
@@ -44,4 +48,4 @@ endif()
4448

4549
add_executable(waifu2x-ncnn main.cpp waifu2x.cpp)
4650

47-
target_link_libraries(waifu2x-ncnn webp ncnn)
51+
target_link_libraries(waifu2x-ncnn webp ncnn ${OpenCV_LIBS})

RealSR-NCNN-Android-CLI/Waifu2x/src/main/jni/main.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ static std::vector<int> parse_optarg_int_array(const char* optarg)
9797
#include "waifu2x.h"
9898

9999
#include "filesystem_utils.h"
100+
#include <opencv2/opencv.hpp>
101+
#include <opencv2/core/hal/interface.h>
102+
using namespace cv;
100103

101104
static void print_usage()
102105
{
@@ -414,7 +417,29 @@ void* save(void* args)
414417

415418
path_t ext = get_file_extension(v.outpath);
416419

417-
if (ext == PATHSTR("webp") || ext == PATHSTR("WEBP"))
420+
if (ext != PATHSTR("gif")) {
421+
// 使用opencv保存图片,速度比默认的stb更快
422+
cv::Mat image;
423+
switch (v.outimage.elempack) {
424+
case 1:
425+
image = cv::Mat( v.outimage.h, v.outimage.w, CV_8UC1, v.outimage.data); // 单通道图像
426+
break;
427+
case 3:
428+
image = cv::Mat(v.outimage.h, v.outimage.w, CV_8UC3, v.outimage.data); // 3通道图像
429+
cv::cvtColor(image, image, cv::COLOR_RGB2BGR);
430+
break;
431+
case 4:
432+
image = cv::Mat(v.outimage.h, v.outimage.w, CV_8UC4, v.outimage.data); // 4通道图像
433+
cv::cvtColor(image, image, cv::COLOR_RGBA2BGRA);
434+
break;
435+
}
436+
if (image.empty()) {
437+
std::cerr << "Error: Image data not loaded." << std::endl;
438+
success = false;
439+
} else {
440+
success = imwrite(v.outpath.c_str(), image);
441+
}
442+
}else if (ext == PATHSTR("webp") || ext == PATHSTR("WEBP"))
418443
{
419444
success = webp_save(v.outpath.c_str(), v.outimage.w, v.outimage.h, v.outimage.elempack, (const unsigned char*)v.outimage.data);
420445
}

0 commit comments

Comments
 (0)