mirror of https://github.com/opencv/opencv.git
commit
8e55659afe
66 changed files with 2407 additions and 998 deletions
@ -0,0 +1,363 @@ |
||||
#ifndef OPENCV_HAL_RVV_MERGE_HPP_INCLUDED |
||||
#define OPENCV_HAL_RVV_MERGE_HPP_INCLUDED |
||||
|
||||
#include <riscv_vector.h> |
||||
|
||||
namespace cv { namespace cv_hal_rvv { |
||||
|
||||
#undef cv_hal_merge8u |
||||
#define cv_hal_merge8u cv::cv_hal_rvv::merge8u |
||||
#undef cv_hal_merge16u |
||||
#define cv_hal_merge16u cv::cv_hal_rvv::merge16u |
||||
#undef cv_hal_merge32s |
||||
#define cv_hal_merge32s cv::cv_hal_rvv::merge32s |
||||
#undef cv_hal_merge64s |
||||
#define cv_hal_merge64s cv::cv_hal_rvv::merge64s |
||||
|
||||
#if defined __GNUC__ |
||||
__attribute__((optimize("no-tree-vectorize"))) |
||||
#endif |
||||
static int merge8u(const uchar** src, uchar* dst, int len, int cn ) { |
||||
int k = cn % 4 ? cn % 4 : 4; |
||||
int i = 0, j; |
||||
int vl = __riscv_vsetvlmax_e8m1(); |
||||
if( k == 1 ) |
||||
{ |
||||
const uchar* src0 = src[0]; |
||||
for( ; i <= len - vl; i += vl) |
||||
{ |
||||
auto a = __riscv_vle8_v_u8m1(src0 + i, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn, sizeof(uchar)*2, a, vl); |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++) |
||||
dst[i*cn] = src0[i]; |
||||
} |
||||
else if( k == 2 ) |
||||
{ |
||||
const uchar *src0 = src[0], *src1 = src[1]; |
||||
for( ; i <= len - vl; i += vl) |
||||
{ |
||||
auto a = __riscv_vle8_v_u8m1(src0 + i, vl); |
||||
auto b = __riscv_vle8_v_u8m1(src1 + i, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn, sizeof(uchar)*2, a, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn + 1, sizeof(uchar)*2, b, vl); |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++ ) |
||||
{ |
||||
dst[i*cn] = src0[i]; |
||||
dst[i*cn+1] = src1[i]; |
||||
} |
||||
} |
||||
else if( k == 3 ) |
||||
{ |
||||
const uchar *src0 = src[0], *src1 = src[1], *src2 = src[2]; |
||||
for( ; i <= len - vl; i += vl) |
||||
{ |
||||
auto a = __riscv_vle8_v_u8m1(src0 + i, vl); |
||||
auto b = __riscv_vle8_v_u8m1(src1 + i, vl); |
||||
auto c = __riscv_vle8_v_u8m1(src2 + i, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn, sizeof(uchar)*3, a, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn + 1, sizeof(uchar)*3, b, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn + 2, sizeof(uchar)*3, c, vl); |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++ ) |
||||
{ |
||||
dst[i*cn] = src0[i]; |
||||
dst[i*cn+1] = src1[i]; |
||||
dst[i*cn+2] = src2[i]; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
const uchar *src0 = src[0], *src1 = src[1], *src2 = src[2], *src3 = src[3]; |
||||
for( ; i <= len - vl; i += vl) |
||||
{ |
||||
auto a = __riscv_vle8_v_u8m1(src0 + i, vl); |
||||
auto b = __riscv_vle8_v_u8m1(src1 + i, vl); |
||||
auto c = __riscv_vle8_v_u8m1(src2 + i, vl); |
||||
auto d = __riscv_vle8_v_u8m1(src3 + i, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn, sizeof(uchar)*4, a, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn + 1, sizeof(uchar)*4, b, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn + 2, sizeof(uchar)*4, c, vl); |
||||
__riscv_vsse8_v_u8m1(dst + i*cn + 3, sizeof(uchar)*4, d, vl); |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++ ) |
||||
{ |
||||
dst[i*cn] = src0[i]; |
||||
dst[i*cn+1] = src1[i]; |
||||
dst[i*cn+2] = src2[i]; |
||||
dst[i*cn+3] = src3[i]; |
||||
} |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; k < cn; k += 4 ) |
||||
{ |
||||
const uchar *src0 = src[k], *src1 = src[k+1], *src2 = src[k+2], *src3 = src[k+3]; |
||||
for( i = 0, j = k; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; dst[j+1] = src1[i]; |
||||
dst[j+2] = src2[i]; dst[j+3] = src3[i]; |
||||
} |
||||
} |
||||
return CV_HAL_ERROR_OK; |
||||
} |
||||
|
||||
#if defined __GNUC__ |
||||
__attribute__((optimize("no-tree-vectorize"))) |
||||
#endif |
||||
static int merge16u(const ushort** src, ushort* dst, int len, int cn ) { |
||||
int k = cn % 4 ? cn % 4 : 4; |
||||
int i = 0, j; |
||||
int vl = __riscv_vsetvlmax_e16m1(); |
||||
if( k == 1 ) |
||||
{ |
||||
const ushort* src0 = src[0]; |
||||
for( ; i <= len - vl; i += vl) |
||||
{ |
||||
auto a = __riscv_vle16_v_u16m1(src0 + i, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn, sizeof(ushort)*2, a, vl); |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++) |
||||
dst[i*cn] = src0[i]; |
||||
} |
||||
else if( k == 2 ) |
||||
{ |
||||
const ushort *src0 = src[0], *src1 = src[1]; |
||||
for( ; i <= len - vl; i += vl) |
||||
{ |
||||
auto a = __riscv_vle16_v_u16m1(src0 + i, vl); |
||||
auto b = __riscv_vle16_v_u16m1(src1 + i, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn, sizeof(ushort)*2, a, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn + 1, sizeof(ushort)*2, b, vl); |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++ ) |
||||
{ |
||||
dst[i*cn] = src0[i]; |
||||
dst[i*cn+1] = src1[i]; |
||||
} |
||||
} |
||||
else if( k == 3 ) |
||||
{ |
||||
const ushort *src0 = src[0], *src1 = src[1], *src2 = src[2]; |
||||
for( ; i <= len - vl; i += vl) |
||||
{ |
||||
auto a = __riscv_vle16_v_u16m1(src0 + i, vl); |
||||
auto b = __riscv_vle16_v_u16m1(src1 + i, vl); |
||||
auto c = __riscv_vle16_v_u16m1(src2 + i, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn, sizeof(ushort)*3, a, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn + 1, sizeof(ushort)*3, b, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn + 2, sizeof(ushort)*3, c, vl); |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++ ) |
||||
{ |
||||
dst[i*cn] = src0[i]; |
||||
dst[i*cn+1] = src1[i]; |
||||
dst[i*cn+2] = src2[i]; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
const ushort *src0 = src[0], *src1 = src[1], *src2 = src[2], *src3 = src[3]; |
||||
for( ; i <= len - vl; i += vl) |
||||
{ |
||||
auto a = __riscv_vle16_v_u16m1(src0 + i, vl); |
||||
auto b = __riscv_vle16_v_u16m1(src1 + i, vl); |
||||
auto c = __riscv_vle16_v_u16m1(src2 + i, vl); |
||||
auto d = __riscv_vle16_v_u16m1(src3 + i, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn, sizeof(ushort)*4, a, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn + 1, sizeof(ushort)*4, b, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn + 2, sizeof(ushort)*4, c, vl); |
||||
__riscv_vsse16_v_u16m1(dst + i*cn + 3, sizeof(ushort)*4, d, vl); |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++ ) |
||||
{ |
||||
dst[i*cn] = src0[i]; |
||||
dst[i*cn+1] = src1[i]; |
||||
dst[i*cn+2] = src2[i]; |
||||
dst[i*cn+3] = src3[i]; |
||||
} |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; k < cn; k += 4 ) |
||||
{ |
||||
const uint16_t *src0 = src[k], *src1 = src[k+1], *src2 = src[k+2], *src3 = src[k+3]; |
||||
for( i = 0, j = k; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; dst[j+1] = src1[i]; |
||||
dst[j+2] = src2[i]; dst[j+3] = src3[i]; |
||||
} |
||||
} |
||||
return CV_HAL_ERROR_OK; |
||||
} |
||||
|
||||
#if defined __GNUC__ |
||||
__attribute__((optimize("no-tree-vectorize"))) |
||||
#endif |
||||
static int merge32s(const int** src, int* dst, int len, int cn ) { |
||||
int k = cn % 4 ? cn % 4 : 4; |
||||
int i, j; |
||||
if( k == 1 ) |
||||
{ |
||||
const int* src0 = src[0]; |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( i = j = 0; i < len; i++, j += cn ) |
||||
dst[j] = src0[i]; |
||||
} |
||||
else if( k == 2 ) |
||||
{ |
||||
const int *src0 = src[0], *src1 = src[1]; |
||||
i = j = 0; |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; |
||||
dst[j+1] = src1[i]; |
||||
} |
||||
} |
||||
else if( k == 3 ) |
||||
{ |
||||
const int *src0 = src[0], *src1 = src[1], *src2 = src[2]; |
||||
i = j = 0; |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; |
||||
dst[j+1] = src1[i]; |
||||
dst[j+2] = src2[i]; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
const int *src0 = src[0], *src1 = src[1], *src2 = src[2], *src3 = src[3]; |
||||
i = j = 0; |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; dst[j+1] = src1[i]; |
||||
dst[j+2] = src2[i]; dst[j+3] = src3[i]; |
||||
} |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; k < cn; k += 4 ) |
||||
{ |
||||
const int *src0 = src[k], *src1 = src[k+1], *src2 = src[k+2], *src3 = src[k+3]; |
||||
for( i = 0, j = k; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; dst[j+1] = src1[i]; |
||||
dst[j+2] = src2[i]; dst[j+3] = src3[i]; |
||||
} |
||||
} |
||||
return CV_HAL_ERROR_OK; |
||||
} |
||||
|
||||
#if defined __GNUC__ |
||||
__attribute__((optimize("no-tree-vectorize"))) |
||||
#endif |
||||
static int merge64s(const int64** src, int64* dst, int len, int cn ) { |
||||
int k = cn % 4 ? cn % 4 : 4; |
||||
int i, j; |
||||
if( k == 1 ) |
||||
{ |
||||
const int64* src0 = src[0]; |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( i = j = 0; i < len; i++, j += cn ) |
||||
dst[j] = src0[i]; |
||||
} |
||||
else if( k == 2 ) |
||||
{ |
||||
const int64 *src0 = src[0], *src1 = src[1]; |
||||
i = j = 0; |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; |
||||
dst[j+1] = src1[i]; |
||||
} |
||||
} |
||||
else if( k == 3 ) |
||||
{ |
||||
const int64 *src0 = src[0], *src1 = src[1], *src2 = src[2]; |
||||
i = j = 0; |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; |
||||
dst[j+1] = src1[i]; |
||||
dst[j+2] = src2[i]; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
const int64 *src0 = src[0], *src1 = src[1], *src2 = src[2], *src3 = src[3]; |
||||
i = j = 0; |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; dst[j+1] = src1[i]; |
||||
dst[j+2] = src2[i]; dst[j+3] = src3[i]; |
||||
} |
||||
} |
||||
#if defined(__clang__) |
||||
#pragma clang loop vectorize(disable) |
||||
#endif |
||||
for( ; k < cn; k += 4 ) |
||||
{ |
||||
const int64 *src0 = src[k], *src1 = src[k+1], *src2 = src[k+2], *src3 = src[k+3]; |
||||
for( i = 0, j = k; i < len; i++, j += cn ) |
||||
{ |
||||
dst[j] = src0[i]; dst[j+1] = src1[i]; |
||||
dst[j+2] = src2[i]; dst[j+3] = src3[i]; |
||||
} |
||||
} |
||||
return CV_HAL_ERROR_OK; |
||||
} |
||||
|
||||
}} |
||||
|
||||
#endif |
File diff suppressed because it is too large
Load Diff
@ -1,19 +1,19 @@ |
||||
{ |
||||
"name": "opencv_js_perf", |
||||
"description": "Perfermance tests for opencv js bindings", |
||||
"description": "Performance tests for opencv js bindings", |
||||
"version": "1.0.0", |
||||
"dependencies" : { |
||||
"benchmark" : "latest" |
||||
"dependencies": { |
||||
"benchmark": "latest" |
||||
}, |
||||
"repository": { |
||||
"type": "git", |
||||
"url": "https://github.com/opencv/opencv.git" |
||||
"type": "git", |
||||
"url": "https://github.com/opencv/opencv.git" |
||||
}, |
||||
"keywords": [], |
||||
"author": "", |
||||
"license": "Apache 2.0 License", |
||||
"bugs": { |
||||
"url": "https://github.com/opencv/opencv/issues" |
||||
"url": "https://github.com/opencv/opencv/issues" |
||||
}, |
||||
"homepage": "https://github.com/opencv/opencv" |
||||
} |
||||
} |
||||
|
@ -1,193 +0,0 @@ |
||||
/*
|
||||
* filestorage_sample demonstrate the usage of the opencv serialization functionality |
||||
*/ |
||||
|
||||
#include "opencv2/core.hpp" |
||||
#include <iostream> |
||||
#include <string> |
||||
|
||||
using std::string; |
||||
using std::cout; |
||||
using std::endl; |
||||
using std::cerr; |
||||
using std::ostream; |
||||
using namespace cv; |
||||
|
||||
static void help(char** av) |
||||
{ |
||||
cout << "\nfilestorage_sample demonstrate the usage of the opencv serialization functionality.\n" |
||||
<< "usage:\n" |
||||
<< av[0] << " outputfile.yml.gz\n" |
||||
<< "\n outputfile above can have many different extensions, see below." |
||||
<< "\nThis program demonstrates the use of FileStorage for serialization, that is in use << and >> in OpenCV\n" |
||||
<< "For example, how to create a class and have it serialize, but also how to use it to read and write matrices.\n" |
||||
<< "FileStorage allows you to serialize to various formats specified by the file end type." |
||||
<< "\nYou should try using different file extensions.(e.g. yaml yml xml xml.gz yaml.gz etc...)\n" << endl; |
||||
} |
||||
|
||||
struct MyData |
||||
{ |
||||
MyData() : |
||||
A(0), X(0), id() |
||||
{ |
||||
} |
||||
explicit MyData(int) : |
||||
A(97), X(CV_PI), id("mydata1234") |
||||
{ |
||||
} |
||||
int A; |
||||
double X; |
||||
string id; |
||||
void write(FileStorage& fs) const //Write serialization for this class
|
||||
{ |
||||
fs << "{" << "A" << A << "X" << X << "id" << id << "}"; |
||||
} |
||||
void read(const FileNode& node) //Read serialization for this class
|
||||
{ |
||||
|
||||
A = (int)node["A"]; |
||||
X = (double)node["X"]; |
||||
id = (string)node["id"]; |
||||
} |
||||
}; |
||||
|
||||
//These write and read functions must exist as per the inline functions in operations.hpp
|
||||
static void write(FileStorage& fs, const std::string&, const MyData& x){ |
||||
x.write(fs); |
||||
} |
||||
static void read(const FileNode& node, MyData& x, const MyData& default_value = MyData()){ |
||||
if(node.empty()) |
||||
x = default_value; |
||||
else |
||||
x.read(node); |
||||
} |
||||
|
||||
static ostream& operator<<(ostream& out, const MyData& m){ |
||||
out << "{ id = " << m.id << ", "; |
||||
out << "X = " << m.X << ", "; |
||||
out << "A = " << m.A << "}"; |
||||
return out; |
||||
} |
||||
int main(int ac, char** av) |
||||
{ |
||||
cv::CommandLineParser parser(ac, av, |
||||
"{@input||}{help h ||}" |
||||
); |
||||
if (parser.has("help")) |
||||
{ |
||||
help(av); |
||||
return 0; |
||||
} |
||||
string filename = parser.get<string>("@input"); |
||||
if (filename.empty()) |
||||
{ |
||||
help(av); |
||||
return 1; |
||||
} |
||||
|
||||
//write
|
||||
{ |
||||
FileStorage fs(filename, FileStorage::WRITE); |
||||
|
||||
cout << "writing images\n"; |
||||
fs << "images" << "["; |
||||
|
||||
fs << "image1.jpg" << "myfi.png" << "baboon.jpg"; |
||||
cout << "image1.jpg" << " myfi.png" << " baboon.jpg" << endl; |
||||
|
||||
fs << "]"; |
||||
|
||||
cout << "writing mats\n"; |
||||
Mat R =Mat_<double>::eye(3, 3),T = Mat_<double>::zeros(3, 1); |
||||
cout << "R = " << R << "\n"; |
||||
cout << "T = " << T << "\n"; |
||||
fs << "R" << R; |
||||
fs << "T" << T; |
||||
|
||||
cout << "writing MyData struct\n"; |
||||
MyData m(1); |
||||
fs << "mdata" << m; |
||||
cout << m << endl; |
||||
} |
||||
|
||||
//read
|
||||
{ |
||||
FileStorage fs(filename, FileStorage::READ); |
||||
|
||||
if (!fs.isOpened()) |
||||
{ |
||||
cerr << "failed to open " << filename << endl; |
||||
help(av); |
||||
return 1; |
||||
} |
||||
|
||||
FileNode n = fs["images"]; |
||||
if (n.type() != FileNode::SEQ) |
||||
{ |
||||
cerr << "images is not a sequence! FAIL" << endl; |
||||
return 1; |
||||
} |
||||
|
||||
cout << "reading images\n"; |
||||
FileNodeIterator it = n.begin(), it_end = n.end(); |
||||
for (; it != it_end; ++it) |
||||
{ |
||||
cout << (string)*it << "\n"; |
||||
} |
||||
|
||||
Mat R, T; |
||||
cout << "reading R and T" << endl; |
||||
|
||||
fs["R"] >> R; |
||||
fs["T"] >> T; |
||||
|
||||
cout << "R = " << R << "\n"; |
||||
cout << "T = " << T << endl; |
||||
|
||||
MyData m; |
||||
fs["mdata"] >> m; |
||||
|
||||
cout << "read mdata\n"; |
||||
cout << m << endl; |
||||
|
||||
cout << "attempting to read mdata_b\n"; //Show default behavior for empty matrix
|
||||
fs["mdata_b"] >> m; |
||||
cout << "read mdata_b\n"; |
||||
cout << m << endl; |
||||
|
||||
} |
||||
|
||||
cout << "Try opening " << filename << " to see the serialized data." << endl << endl; |
||||
|
||||
//read from string
|
||||
{ |
||||
cout << "Read data from string\n"; |
||||
string dataString = |
||||
"%YAML:1.0\n" |
||||
"mdata:\n" |
||||
" A: 97\n" |
||||
" X: 3.1415926535897931e+00\n" |
||||
" id: mydata1234\n"; |
||||
MyData m; |
||||
FileStorage fs(dataString, FileStorage::READ | FileStorage::MEMORY); |
||||
cout << "attempting to read mdata_b from string\n"; //Show default behavior for empty matrix
|
||||
fs["mdata"] >> m; |
||||
cout << "read mdata\n"; |
||||
cout << m << endl; |
||||
} |
||||
|
||||
//write to string
|
||||
{ |
||||
cout << "Write data to string\n"; |
||||
FileStorage fs(filename, FileStorage::WRITE | FileStorage::MEMORY | FileStorage::FORMAT_YAML); |
||||
|
||||
cout << "writing MyData struct\n"; |
||||
MyData m(1); |
||||
fs << "mdata" << m; |
||||
cout << m << endl; |
||||
string createdString = fs.releaseAndGetString(); |
||||
cout << "Created string:\n" << createdString << "\n"; |
||||
} |
||||
|
||||
return 0; |
||||
} |
Loading…
Reference in new issue