Merge remote-tracking branch 'upstream/master' into brisk
This commit is contained in:
commit
0ded2984b8
2
3rdparty/ffmpeg/ffmpeg_version.cmake
vendored
2
3rdparty/ffmpeg/ffmpeg_version.cmake
vendored
@ -3,9 +3,11 @@ set(HAVE_FFMPEG_CODEC 1)
|
||||
set(HAVE_FFMPEG_FORMAT 1)
|
||||
set(HAVE_FFMPEG_UTIL 1)
|
||||
set(HAVE_FFMPEG_SWSCALE 1)
|
||||
set(HAVE_FFMPEG_RESAMPLE 0)
|
||||
set(HAVE_GENTOO_FFMPEG 1)
|
||||
|
||||
set(ALIASOF_libavcodec_VERSION 55.18.102)
|
||||
set(ALIASOF_libavformat_VERSION 55.12.100)
|
||||
set(ALIASOF_libavutil_VERSION 52.38.100)
|
||||
set(ALIASOF_libswscale_VERSION 2.3.100)
|
||||
set(ALIASOF_libavresample_VERSION 1.0.1)
|
@ -931,6 +931,7 @@ if(DEFINED WITH_FFMPEG)
|
||||
status(" format:" HAVE_FFMPEG_FORMAT THEN "YES (ver ${ALIASOF_libavformat_VERSION})" ELSE NO)
|
||||
status(" util:" HAVE_FFMPEG_UTIL THEN "YES (ver ${ALIASOF_libavutil_VERSION})" ELSE NO)
|
||||
status(" swscale:" HAVE_FFMPEG_SWSCALE THEN "YES (ver ${ALIASOF_libswscale_VERSION})" ELSE NO)
|
||||
status(" resample:" HAVE_FFMPEG_RESAMPLE THEN "YES (ver ${ALIASOF_libavresample_VERSION})" ELSE NO)
|
||||
status(" gentoo-style:" HAVE_GENTOO_FFMPEG THEN YES ELSE NO)
|
||||
endif(DEFINED WITH_FFMPEG)
|
||||
|
||||
|
@ -619,6 +619,8 @@ if(DEFINED CUDA_TARGET_CPU_ARCH)
|
||||
set(_cuda_target_cpu_arch_initial "${CUDA_TARGET_CPU_ARCH}")
|
||||
elseif(CUDA_VERSION VERSION_GREATER "5.0" AND CMAKE_CROSSCOMPILING AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|ARM)")
|
||||
set(_cuda_target_cpu_arch_initial "ARM")
|
||||
elseif(CUDA_VERSION VERSION_GREATER "6.5" AND CMAKE_CROSSCOMPILING AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|AARCH64)")
|
||||
set(_cuda_target_cpu_arch_initial "AARCH64")
|
||||
else()
|
||||
set(_cuda_target_cpu_arch_initial "")
|
||||
endif()
|
||||
@ -643,6 +645,12 @@ elseif(CUDA_VERSION VERSION_GREATER "5.0" AND CMAKE_CROSSCOMPILING AND "${CUDA_T
|
||||
elseif(EXISTS "${CUDA_TOOLKIT_ROOT_DIR}/targets/armv7-linux-gnueabihf")
|
||||
set(_cuda_target_triplet_initial "armv7-linux-gnueabihf")
|
||||
endif()
|
||||
elseif(CUDA_VERSION VERSION_GREATER "6.5" AND CMAKE_CROSSCOMPILING AND "${CUDA_TARGET_CPU_ARCH}" STREQUAL "AARCH64")
|
||||
if("${CUDA_TARGET_OS_VARIANT}" STREQUAL "Android" AND EXISTS "${CUDA_TOOLKIT_ROOT_DIR}/targets/aarch64-linux-androideabi")
|
||||
set(_cuda_target_triplet_initial "aarch64-linux-androideabi")
|
||||
elseif(EXISTS "${CUDA_TOOLKIT_ROOT_DIR}/targets/aarch64-linux-gnueabihf")
|
||||
set(_cuda_target_triplet_initial "aarch64-linux-gnueabihf")
|
||||
endif()
|
||||
endif()
|
||||
set(CUDA_TARGET_TRIPLET "${_cuda_target_triplet_initial}" CACHE STRING "Specify the target triplet for which the input files must be compiled.")
|
||||
file(GLOB __cuda_available_target_tiplets RELATIVE "${CUDA_TOOLKIT_ROOT_DIR}/targets" "${CUDA_TOOLKIT_ROOT_DIR}/targets/*" )
|
||||
@ -1094,8 +1102,10 @@ macro(CUDA_WRAP_SRCS cuda_target format generated_files)
|
||||
set(nvcc_flags ${nvcc_flags} -m32)
|
||||
endif()
|
||||
|
||||
if(CUDA_TARGET_CPU_ARCH)
|
||||
set(nvcc_flags ${nvcc_flags} "--target-cpu-architecture=${CUDA_TARGET_CPU_ARCH}")
|
||||
if(CUDA_TARGET_CPU_ARCH AND CUDA_VERSION VERSION_LESS "7.0")
|
||||
# CPU architecture is either ARM or X86. Patch AARCH64 to be ARM
|
||||
string(REPLACE "AARCH64" "ARM" CUDA_TARGET_CPU_ARCH_patched ${CUDA_TARGET_CPU_ARCH})
|
||||
set(nvcc_flags ${nvcc_flags} "--target-cpu-architecture=${CUDA_TARGET_CPU_ARCH_patched}")
|
||||
endif()
|
||||
|
||||
if(CUDA_TARGET_OS_VARIANT AND CUDA_VERSION VERSION_LESS "7.0")
|
||||
|
@ -187,7 +187,7 @@ if(WITH_XIMEA)
|
||||
endif(WITH_XIMEA)
|
||||
|
||||
# --- FFMPEG ---
|
||||
ocv_clear_vars(HAVE_FFMPEG HAVE_FFMPEG_CODEC HAVE_FFMPEG_FORMAT HAVE_FFMPEG_UTIL HAVE_FFMPEG_SWSCALE HAVE_GENTOO_FFMPEG HAVE_FFMPEG_FFMPEG)
|
||||
ocv_clear_vars(HAVE_FFMPEG HAVE_FFMPEG_CODEC HAVE_FFMPEG_FORMAT HAVE_FFMPEG_UTIL HAVE_FFMPEG_SWSCALE HAVE_FFMPEG_RESAMPLE HAVE_GENTOO_FFMPEG HAVE_FFMPEG_FFMPEG)
|
||||
if(WITH_FFMPEG)
|
||||
if(WIN32 AND NOT ARM)
|
||||
include("${OpenCV_SOURCE_DIR}/3rdparty/ffmpeg/ffmpeg_version.cmake")
|
||||
@ -196,6 +196,7 @@ if(WITH_FFMPEG)
|
||||
CHECK_MODULE(libavformat HAVE_FFMPEG_FORMAT)
|
||||
CHECK_MODULE(libavutil HAVE_FFMPEG_UTIL)
|
||||
CHECK_MODULE(libswscale HAVE_FFMPEG_SWSCALE)
|
||||
CHECK_MODULE(libavresample HAVE_FFMPEG_RESAMPLE)
|
||||
|
||||
CHECK_INCLUDE_FILE(libavformat/avformat.h HAVE_GENTOO_FFMPEG)
|
||||
CHECK_INCLUDE_FILE(ffmpeg/avformat.h HAVE_FFMPEG_FFMPEG)
|
||||
@ -239,6 +240,10 @@ if(WITH_FFMPEG)
|
||||
set(HAVE_FFMPEG_SWSCALE 1)
|
||||
set(ALIASOF_libswscale_VERSION "Unknown")
|
||||
set(HAVE_FFMPEG 1)
|
||||
if(EXISTS "${FFMPEG_LIB_DIR}/libavresample.a")
|
||||
set(HAVE_FFMPEG_RESAMPLE 1)
|
||||
set(ALIASOF_libavresample_VERSION "Unknown")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
@ -248,6 +253,9 @@ if(WITH_FFMPEG)
|
||||
set(VIDEOIO_LIBRARIES ${VIDEOIO_LIBRARIES} "${FFMPEG_LIB_DIR}/libavcodec.a"
|
||||
"${FFMPEG_LIB_DIR}/libavformat.a" "${FFMPEG_LIB_DIR}/libavutil.a"
|
||||
"${FFMPEG_LIB_DIR}/libswscale.a")
|
||||
if(HAVE_FFMPEG_RESAMPLE)
|
||||
set(VIDEOIO_LIBRARIES ${VIDEOIO_LIBRARIES} "${FFMPEG_LIB_DIR}/libavresample.a")
|
||||
endif()
|
||||
ocv_include_directories(${FFMPEG_INCLUDE_DIR})
|
||||
endif()
|
||||
endif(APPLE)
|
||||
|
@ -21,6 +21,7 @@
|
||||
</libs>
|
||||
|
||||
<skip_headers>
|
||||
opencv2/hal/intrin*
|
||||
opencv2/core/cuda*
|
||||
opencv2/core/private*
|
||||
opencv/cxeigen.hpp
|
||||
|
@ -1,13 +1,19 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
"""gen_pattern.py
|
||||
To run:
|
||||
-c 10 -r 12 -o out.svg
|
||||
-T type of pattern, circles, acircles, checkerboard
|
||||
-s --square_size size of squares in pattern
|
||||
-u --units mm, inches, px, m
|
||||
-w page width in units
|
||||
-h page height in units
|
||||
Usage example:
|
||||
python gen_pattern.py -o out.svg -r 11 -c 8 -T circles -s 20.0 -R 5.0 -u mm -w 216 -h 279
|
||||
|
||||
-o, --output - output file (default out.svg)
|
||||
-r, --rows - pattern rows (default 11)
|
||||
-c, --columns - pattern columns (default 8)
|
||||
-T, --type - type of pattern, circles, acircles, checkerboard (default circles)
|
||||
-s, --square_size - size of squares in pattern (default 20.0)
|
||||
-R, --radius_rate - circles_radius = square_size/radius_rate (default 5.0)
|
||||
-u, --units - mm, inches, px, m (default mm)
|
||||
-w, --page_width - page width in units (default 216)
|
||||
-h, --page_height - page height in units (default 279)
|
||||
-H, --help - show help
|
||||
"""
|
||||
|
||||
from svgfig import *
|
||||
@ -16,18 +22,20 @@ import sys
|
||||
import getopt
|
||||
|
||||
class PatternMaker:
|
||||
def __init__(self, cols,rows,output,units,square_size,page_width,page_height):
|
||||
def __init__(self, cols,rows,output,units,square_size,radius_rate,page_width,page_height):
|
||||
self.cols = cols
|
||||
self.rows = rows
|
||||
self.output = output
|
||||
self.units = units
|
||||
self.square_size = square_size
|
||||
self.radius_rate = radius_rate
|
||||
self.width = page_width
|
||||
self.height = page_height
|
||||
self.g = SVG("g") # the svg group container
|
||||
|
||||
def makeCirclesPattern(self):
|
||||
spacing = self.square_size
|
||||
r = spacing / 5.0 #radius is a 5th of the spacing TODO parameterize
|
||||
r = spacing / self.radius_rate
|
||||
for x in range(1,self.cols+1):
|
||||
for y in range(1,self.rows+1):
|
||||
dot = SVG("circle", cx=x * spacing, cy=y * spacing, r=r, fill="black")
|
||||
@ -35,7 +43,7 @@ class PatternMaker:
|
||||
|
||||
def makeACirclesPattern(self):
|
||||
spacing = self.square_size
|
||||
r = spacing / 5.0
|
||||
r = spacing / self.radius_rate
|
||||
for i in range(0,self.rows):
|
||||
for j in range(0,self.cols):
|
||||
dot = SVG("circle", cx= ((j*2 + i%2)*spacing) + spacing, cy=self.height - (i * spacing + spacing), r=r, fill="black")
|
||||
@ -43,37 +51,23 @@ class PatternMaker:
|
||||
|
||||
def makeCheckerboardPattern(self):
|
||||
spacing = self.square_size
|
||||
r = spacing / 5.0
|
||||
for x in range(1,self.cols+1):
|
||||
for y in range(1,self.rows+1):
|
||||
#TODO make a checkerboard pattern
|
||||
dot = SVG("circle", cx=x * spacing, cy=y * spacing, r=r, fill="black")
|
||||
self.g.append(dot)
|
||||
if x%2 == y%2:
|
||||
dot = SVG("rect", x=x * spacing, y=y * spacing, width=spacing, height=spacing, stroke_width="0", fill="black")
|
||||
self.g.append(dot)
|
||||
|
||||
def save(self):
|
||||
c = canvas(self.g,width="%d%s"%(self.width,self.units),height="%d%s"%(self.height,self.units),viewBox="0 0 %d %d"%(self.width,self.height))
|
||||
c.inkview(self.output)
|
||||
|
||||
def makePattern(cols,rows,output,p_type,units,square_size,page_width,page_height):
|
||||
width = page_width
|
||||
spacing = square_size
|
||||
height = page_height
|
||||
r = spacing / 5.0
|
||||
g = SVG("g") # the svg group container
|
||||
for x in range(1,cols+1):
|
||||
for y in range(1,rows+1):
|
||||
if "circle" in p_type:
|
||||
dot = SVG("circle", cx=x * spacing, cy=y * spacing, r=r, fill="black")
|
||||
g.append(dot)
|
||||
c = canvas(g,width="%d%s"%(width,units),height="%d%s"%(height,units),viewBox="0 0 %d %d"%(width,height))
|
||||
c.inkview(output)
|
||||
|
||||
|
||||
def main():
|
||||
# parse command line options, TODO use argparse for better doc
|
||||
try:
|
||||
opts, args = getopt.getopt(sys.argv[1:], "ho:c:r:T:u:s:w:h:", ["help","output","columns","rows",
|
||||
"type","units","square_size","page_width",
|
||||
"page_height"])
|
||||
opts, args = getopt.getopt(sys.argv[1:], "Ho:c:r:T:u:s:R:w:h:", ["help","output=","columns=","rows=",
|
||||
"type=","units=","square_size=","radius_rate=",
|
||||
"page_width=","page_height="])
|
||||
except getopt.error, msg:
|
||||
print msg
|
||||
print "for help use --help"
|
||||
@ -84,11 +78,12 @@ def main():
|
||||
p_type = "circles"
|
||||
units = "mm"
|
||||
square_size = 20.0
|
||||
radius_rate = 5.0
|
||||
page_width = 216 #8.5 inches
|
||||
page_height = 279 #11 inches
|
||||
# process options
|
||||
for o, a in opts:
|
||||
if o in ("-h", "--help"):
|
||||
if o in ("-H", "--help"):
|
||||
print __doc__
|
||||
sys.exit(0)
|
||||
elif o in ("-r", "--rows"):
|
||||
@ -103,11 +98,13 @@ def main():
|
||||
units = a
|
||||
elif o in ("-s", "--square_size"):
|
||||
square_size = float(a)
|
||||
elif o in ("-R", "--radius_rate"):
|
||||
radius_rate = float(a)
|
||||
elif o in ("-w", "--page_width"):
|
||||
page_width = float(a)
|
||||
elif o in ("-h", "--page_height"):
|
||||
page_height = float(a)
|
||||
pm = PatternMaker(columns,rows,output,units,square_size,page_width,page_height)
|
||||
pm = PatternMaker(columns,rows,output,units,square_size,radius_rate,page_width,page_height)
|
||||
#dict for easy lookup of pattern type
|
||||
mp = {"circles":pm.makeCirclesPattern,"acircles":pm.makeACirclesPattern,"checkerboard":pm.makeCheckerboardPattern}
|
||||
mp[p_type]()
|
||||
|
@ -44,7 +44,7 @@ from matplotlib import pyplot as plt
|
||||
imgL = cv2.imread('tsukuba_l.png',0)
|
||||
imgR = cv2.imread('tsukuba_r.png',0)
|
||||
|
||||
stereo = cv2.createStereoBM(numDisparities=16, blockSize=15)
|
||||
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
|
||||
disparity = stereo.compute(imgL,imgR)
|
||||
plt.imshow(disparity,'gray')
|
||||
plt.show()
|
||||
|
@ -41,7 +41,7 @@ Windows users also execute:
|
||||
$ bii cpp:configure -G "Visual Studio 12"
|
||||
@endcode
|
||||
|
||||
Now execute ``bii cpp:build`` to build the project. **Note** that this can take a while, until it downloads and builds OpenCV. However, this is downloaded just once in your machine in your "user/.biicode" folder. If the OpenCV installation process fails, you might simply go there, delete OpenCV files inside "user/.biicode" and repeat.
|
||||
Now execute ``bii cpp:build`` to build the project. @note This can take a while, until it downloads and builds OpenCV. However, this is downloaded just once in your machine to your "user/.biicode" folder. If the OpenCV installation process fails, you might simply go there, delete OpenCV files inside "user/.biicode" and repeat.
|
||||
|
||||
@code{.bash}
|
||||
$ bii cpp:build
|
||||
@ -137,7 +137,7 @@ replace with:
|
||||
diego/opencv(beta): 0
|
||||
@endcode
|
||||
|
||||
**Note** that the first time you switch to 3.0-beta, it will also take a while to download and build the 3.0-beta release. From that point you can change back and forth between versions, just modifying your *biicode.conf requirements*.
|
||||
@note The first time you switch to 3.0-beta, it will also take a while to download and build the 3.0-beta release. From that point on you can change back and forth between versions just by modifying your *biicode.conf requirements*.
|
||||
|
||||
Find the hooks and examples:
|
||||
* [OpenCV 2.4.10](http://www.biicode.com/diego/opencv)
|
||||
|
@ -53,9 +53,9 @@ Now you have to create your CMakeLists.txt file. It should look like this:
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
project( DisplayImage )
|
||||
find_package( OpenCV REQUIRED )
|
||||
include_directories( \f${OpenCV_INCLUDE_DIRS} )
|
||||
include_directories( ${OpenCV_INCLUDE_DIRS} )
|
||||
add_executable( DisplayImage DisplayImage.cpp )
|
||||
target_link_libraries( DisplayImage \f${OpenCV_LIBS} )
|
||||
target_link_libraries( DisplayImage ${OpenCV_LIBS} )
|
||||
@endcode
|
||||
### Generate the executable
|
||||
|
||||
|
@ -1200,7 +1200,7 @@ for the other points. The array is computed only in the RANSAC and LMedS methods
|
||||
This function estimates essential matrix based on the five-point algorithm solver in @cite Nister03 .
|
||||
@cite SteweniusCFS is also a related. The epipolar geometry is described by the following equation:
|
||||
|
||||
\f[[p_2; 1]^T K^T E K [p_1; 1] = 0 \\\f]\f[K =
|
||||
\f[[p_2; 1]^T K^{-T} E K^{-1} [p_1; 1] = 0 \\\f]\f[K =
|
||||
\begin{bmatrix}
|
||||
f & 0 & x_{pp} \\
|
||||
0 & f & y_{pp} \\
|
||||
|
@ -641,7 +641,7 @@ static int run8Point( const Mat& _m1, const Mat& _m2, Mat& _fmatrix )
|
||||
W.at<double>(2) = 0.;
|
||||
|
||||
// F0 <- U*diag([W(1), W(2), 0])*V'
|
||||
gemm( U, Mat::diag(W), 1., 0, 0., TF, GEMM_1_T );
|
||||
gemm( U, Mat::diag(W), 1., 0, 0., TF, 0 );
|
||||
gemm( TF, V, 1., 0, 0., F0, 0/*CV_GEMM_B_T*/ );
|
||||
|
||||
// apply the transformation that is inverse
|
||||
|
@ -63,8 +63,7 @@ cvTriangulatePoints(CvMat* projMatr1, CvMat* projMatr2, CvMat* projPoints1, CvMa
|
||||
!CV_IS_MAT(points4D) )
|
||||
CV_Error( CV_StsUnsupportedFormat, "Input parameters must be matrices" );
|
||||
|
||||
int numPoints;
|
||||
numPoints = projPoints1->cols;
|
||||
int numPoints = projPoints1->cols;
|
||||
|
||||
if( numPoints < 1 )
|
||||
CV_Error( CV_StsOutOfRange, "Number of points must be more than zero" );
|
||||
@ -82,57 +81,39 @@ cvTriangulatePoints(CvMat* projMatr1, CvMat* projMatr2, CvMat* projPoints1, CvMa
|
||||
projMatr2->cols != 4 || projMatr2->rows != 3)
|
||||
CV_Error( CV_StsUnmatchedSizes, "Size of projection matrices must be 3x4" );
|
||||
|
||||
CvMat matrA;
|
||||
double matrA_dat[24];
|
||||
matrA = cvMat(6,4,CV_64F,matrA_dat);
|
||||
// preallocate SVD matrices on stack
|
||||
cv::Matx<double, 6, 4> matrA;
|
||||
cv::Matx<double, 6, 4> matrU;
|
||||
cv::Matx<double, 4, 1> matrW;
|
||||
cv::Matx<double, 4, 4> matrV;
|
||||
|
||||
//CvMat matrU;
|
||||
CvMat matrW;
|
||||
CvMat matrV;
|
||||
//double matrU_dat[9*9];
|
||||
double matrW_dat[6*4];
|
||||
double matrV_dat[4*4];
|
||||
|
||||
//matrU = cvMat(6,6,CV_64F,matrU_dat);
|
||||
matrW = cvMat(6,4,CV_64F,matrW_dat);
|
||||
matrV = cvMat(4,4,CV_64F,matrV_dat);
|
||||
|
||||
CvMat* projPoints[2];
|
||||
CvMat* projMatrs[2];
|
||||
|
||||
projPoints[0] = projPoints1;
|
||||
projPoints[1] = projPoints2;
|
||||
|
||||
projMatrs[0] = projMatr1;
|
||||
projMatrs[1] = projMatr2;
|
||||
CvMat* projPoints[2] = {projPoints1, projPoints2};
|
||||
CvMat* projMatrs[2] = {projMatr1, projMatr2};
|
||||
|
||||
/* Solve system for each point */
|
||||
int i,j;
|
||||
for( i = 0; i < numPoints; i++ )/* For each point */
|
||||
for( int i = 0; i < numPoints; i++ )/* For each point */
|
||||
{
|
||||
/* Fill matrix for current point */
|
||||
for( j = 0; j < 2; j++ )/* For each view */
|
||||
for( int j = 0; j < 2; j++ )/* For each view */
|
||||
{
|
||||
double x,y;
|
||||
x = cvmGet(projPoints[j],0,i);
|
||||
y = cvmGet(projPoints[j],1,i);
|
||||
for( int k = 0; k < 4; k++ )
|
||||
{
|
||||
cvmSet(&matrA, j*3+0, k, x * cvmGet(projMatrs[j],2,k) - cvmGet(projMatrs[j],0,k) );
|
||||
cvmSet(&matrA, j*3+1, k, y * cvmGet(projMatrs[j],2,k) - cvmGet(projMatrs[j],1,k) );
|
||||
cvmSet(&matrA, j*3+2, k, x * cvmGet(projMatrs[j],1,k) - y * cvmGet(projMatrs[j],0,k) );
|
||||
matrA(j*3+0, k) = x * cvmGet(projMatrs[j],2,k) - cvmGet(projMatrs[j],0,k);
|
||||
matrA(j*3+1, k) = y * cvmGet(projMatrs[j],2,k) - cvmGet(projMatrs[j],1,k);
|
||||
matrA(j*3+2, k) = x * cvmGet(projMatrs[j],1,k) - y * cvmGet(projMatrs[j],0,k);
|
||||
}
|
||||
}
|
||||
/* Solve system for current point */
|
||||
{
|
||||
cvSVD(&matrA,&matrW,0,&matrV,CV_SVD_V_T);
|
||||
cv::SVD::compute(matrA, matrW, matrU, matrV);
|
||||
|
||||
/* Copy computed point */
|
||||
cvmSet(points4D,0,i,cvmGet(&matrV,3,0));/* X */
|
||||
cvmSet(points4D,1,i,cvmGet(&matrV,3,1));/* Y */
|
||||
cvmSet(points4D,2,i,cvmGet(&matrV,3,2));/* Z */
|
||||
cvmSet(points4D,3,i,cvmGet(&matrV,3,3));/* W */
|
||||
}
|
||||
/* Copy computed point */
|
||||
cvmSet(points4D,0,i,matrV(3,0));/* X */
|
||||
cvmSet(points4D,1,i,matrV(3,1));/* Y */
|
||||
cvmSet(points4D,2,i,matrV(3,2));/* Z */
|
||||
cvmSet(points4D,3,i,matrV(3,3));/* W */
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
@ -381,7 +381,7 @@ TEST_F(fisheyeTest, EtimateUncertainties)
|
||||
EXPECT_MAT_NEAR(errors.c, cv::Vec2d(0.890439368129246, 0.816096854937896), 1e-10);
|
||||
EXPECT_MAT_NEAR(errors.k, cv::Vec4d(0.00516248605191506, 0.0168181467500934, 0.0213118690274604, 0.00916010877545648), 1e-10);
|
||||
EXPECT_MAT_NEAR(err_std, cv::Vec2d(0.187475975266883, 0.185678953263995), 1e-10);
|
||||
CV_Assert(abs(rms - 0.263782587133546) < 1e-10);
|
||||
CV_Assert(fabs(rms - 0.263782587133546) < 1e-10);
|
||||
CV_Assert(errors.alpha == 0);
|
||||
}
|
||||
|
||||
|
@ -973,26 +973,12 @@ int CV_FundamentalMatTest::prepare_test_case( int test_case_idx )
|
||||
return code;
|
||||
}
|
||||
|
||||
|
||||
void CV_FundamentalMatTest::run_func()
|
||||
{
|
||||
//if(!test_cpp)
|
||||
{
|
||||
CvMat _input0 = test_mat[INPUT][0], _input1 = test_mat[INPUT][1];
|
||||
CvMat F = test_mat[TEMP][0], mask = test_mat[TEMP][1];
|
||||
f_result = cvFindFundamentalMat( &_input0, &_input1, &F, method, MAX(sigma*3, 0.01), 0, &mask );
|
||||
}
|
||||
/*else
|
||||
{
|
||||
cv::findFundamentalMat(const Mat& points1, const Mat& points2,
|
||||
vector<uchar>& mask, int method=FM_RANSAC,
|
||||
double param1=3., double param2=0.99 );
|
||||
|
||||
CV_EXPORTS Mat findFundamentalMat( const Mat& points1, const Mat& points2,
|
||||
int method=FM_RANSAC,
|
||||
double param1=3., double param2=0.99 );
|
||||
}*/
|
||||
|
||||
// cvFindFundamentalMat calls cv::findFundamentalMat
|
||||
CvMat _input0 = test_mat[INPUT][0], _input1 = test_mat[INPUT][1];
|
||||
CvMat F = test_mat[TEMP][0], mask = test_mat[TEMP][1];
|
||||
f_result = cvFindFundamentalMat( &_input0, &_input1, &F, method, MAX(sigma*3, 0.01), 0, &mask );
|
||||
}
|
||||
|
||||
|
||||
@ -1022,7 +1008,7 @@ void CV_FundamentalMatTest::prepare_to_validation( int test_case_idx )
|
||||
F0 *= 1./f0[8];
|
||||
|
||||
uchar* status = test_mat[TEMP][1].ptr();
|
||||
double err_level = method <= CV_FM_8POINT ? 1 : get_success_error_level( test_case_idx, OUTPUT, 1 );
|
||||
double err_level = get_success_error_level( test_case_idx, OUTPUT, 1 );
|
||||
uchar* mtfm1 = test_mat[REF_OUTPUT][1].ptr();
|
||||
uchar* mtfm2 = test_mat[OUTPUT][1].ptr();
|
||||
double* f_prop1 = test_mat[REF_OUTPUT][0].ptr<double>();
|
||||
|
@ -2451,9 +2451,7 @@ matrix. The Singular Value Decomposition is used to solve least-square
|
||||
problems, under-determined linear systems, invert matrices, compute
|
||||
condition numbers, and so on.
|
||||
|
||||
For a faster operation, you can pass flags=SVD::MODIFY_A|... to modify
|
||||
the decomposed matrix when it is not necessary to preserve it. If you
|
||||
want to compute a condition number of a matrix or an absolute value of
|
||||
If you want to compute a condition number of a matrix or an absolute value of
|
||||
its determinant, you do not need `u` and `vt`. You can pass
|
||||
flags=SVD::NO_UV|... . Another flag SVD::FULL_UV indicates that full-size u
|
||||
and vt must be computed, which is not necessary most of the time.
|
||||
@ -2464,8 +2462,8 @@ class CV_EXPORTS SVD
|
||||
{
|
||||
public:
|
||||
enum Flags {
|
||||
/** use the algorithm to modify the decomposed matrix; it can save space and speed up
|
||||
processing */
|
||||
/** allow the algorithm to modify the decomposed matrix; it can save space and speed up
|
||||
processing. currently ignored. */
|
||||
MODIFY_A = 1,
|
||||
/** indicates that only a vector of singular values `w` is to be processed, while u and vt
|
||||
will be set to empty matrices */
|
||||
|
@ -53,6 +53,7 @@
|
||||
|
||||
#include "opencv2/core/cvdef.h"
|
||||
#include "opencv2/core/cvstd.hpp"
|
||||
#include "opencv2/hal.hpp"
|
||||
|
||||
namespace cv
|
||||
{
|
||||
@ -400,136 +401,6 @@ configurations while CV_DbgAssert is only retained in the Debug configuration.
|
||||
# define CV_DbgAssert(expr)
|
||||
#endif
|
||||
|
||||
|
||||
/////////////// saturate_cast (used in image & signal processing) ///////////////////
|
||||
|
||||
/**
|
||||
Template function for accurate conversion from one primitive type to another.
|
||||
|
||||
The functions saturate_cast resemble the standard C++ cast operations, such as static_cast\<T\>()
|
||||
and others. They perform an efficient and accurate conversion from one primitive type to another
|
||||
(see the introduction chapter). saturate in the name means that when the input value v is out of the
|
||||
range of the target type, the result is not formed just by taking low bits of the input, but instead
|
||||
the value is clipped. For example:
|
||||
@code
|
||||
uchar a = saturate_cast<uchar>(-100); // a = 0 (UCHAR_MIN)
|
||||
short b = saturate_cast<short>(33333.33333); // b = 32767 (SHRT_MAX)
|
||||
@endcode
|
||||
Such clipping is done when the target type is unsigned char , signed char , unsigned short or
|
||||
signed short . For 32-bit integers, no clipping is done.
|
||||
|
||||
When the parameter is a floating-point value and the target type is an integer (8-, 16- or 32-bit),
|
||||
the floating-point value is first rounded to the nearest integer and then clipped if needed (when
|
||||
the target type is 8- or 16-bit).
|
||||
|
||||
This operation is used in the simplest or most complex image processing functions in OpenCV.
|
||||
|
||||
@param v Function parameter.
|
||||
@sa add, subtract, multiply, divide, Mat::convertTo
|
||||
*/
|
||||
template<typename _Tp> static inline _Tp saturate_cast(uchar v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(schar v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(ushort v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(short v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(unsigned v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(int v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(float v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(double v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(int64 v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(uint64 v) { return _Tp(v); }
|
||||
|
||||
//! @cond IGNORED
|
||||
|
||||
template<> inline uchar saturate_cast<uchar>(schar v) { return (uchar)std::max((int)v, 0); }
|
||||
template<> inline uchar saturate_cast<uchar>(ushort v) { return (uchar)std::min((unsigned)v, (unsigned)UCHAR_MAX); }
|
||||
template<> inline uchar saturate_cast<uchar>(int v) { return (uchar)((unsigned)v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); }
|
||||
template<> inline uchar saturate_cast<uchar>(short v) { return saturate_cast<uchar>((int)v); }
|
||||
template<> inline uchar saturate_cast<uchar>(unsigned v) { return (uchar)std::min(v, (unsigned)UCHAR_MAX); }
|
||||
template<> inline uchar saturate_cast<uchar>(float v) { int iv = cvRound(v); return saturate_cast<uchar>(iv); }
|
||||
template<> inline uchar saturate_cast<uchar>(double v) { int iv = cvRound(v); return saturate_cast<uchar>(iv); }
|
||||
template<> inline uchar saturate_cast<uchar>(int64 v) { return (uchar)((uint64)v <= (uint64)UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); }
|
||||
template<> inline uchar saturate_cast<uchar>(uint64 v) { return (uchar)std::min(v, (uint64)UCHAR_MAX); }
|
||||
|
||||
template<> inline schar saturate_cast<schar>(uchar v) { return (schar)std::min((int)v, SCHAR_MAX); }
|
||||
template<> inline schar saturate_cast<schar>(ushort v) { return (schar)std::min((unsigned)v, (unsigned)SCHAR_MAX); }
|
||||
template<> inline schar saturate_cast<schar>(int v) { return (schar)((unsigned)(v-SCHAR_MIN) <= (unsigned)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); }
|
||||
template<> inline schar saturate_cast<schar>(short v) { return saturate_cast<schar>((int)v); }
|
||||
template<> inline schar saturate_cast<schar>(unsigned v) { return (schar)std::min(v, (unsigned)SCHAR_MAX); }
|
||||
template<> inline schar saturate_cast<schar>(float v) { int iv = cvRound(v); return saturate_cast<schar>(iv); }
|
||||
template<> inline schar saturate_cast<schar>(double v) { int iv = cvRound(v); return saturate_cast<schar>(iv); }
|
||||
template<> inline schar saturate_cast<schar>(int64 v) { return (schar)((uint64)((int64)v-SCHAR_MIN) <= (uint64)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); }
|
||||
template<> inline schar saturate_cast<schar>(uint64 v) { return (schar)std::min(v, (uint64)SCHAR_MAX); }
|
||||
|
||||
template<> inline ushort saturate_cast<ushort>(schar v) { return (ushort)std::max((int)v, 0); }
|
||||
template<> inline ushort saturate_cast<ushort>(short v) { return (ushort)std::max((int)v, 0); }
|
||||
template<> inline ushort saturate_cast<ushort>(int v) { return (ushort)((unsigned)v <= (unsigned)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); }
|
||||
template<> inline ushort saturate_cast<ushort>(unsigned v) { return (ushort)std::min(v, (unsigned)USHRT_MAX); }
|
||||
template<> inline ushort saturate_cast<ushort>(float v) { int iv = cvRound(v); return saturate_cast<ushort>(iv); }
|
||||
template<> inline ushort saturate_cast<ushort>(double v) { int iv = cvRound(v); return saturate_cast<ushort>(iv); }
|
||||
template<> inline ushort saturate_cast<ushort>(int64 v) { return (ushort)((uint64)v <= (uint64)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); }
|
||||
template<> inline ushort saturate_cast<ushort>(uint64 v) { return (ushort)std::min(v, (uint64)USHRT_MAX); }
|
||||
|
||||
template<> inline short saturate_cast<short>(ushort v) { return (short)std::min((int)v, SHRT_MAX); }
|
||||
template<> inline short saturate_cast<short>(int v) { return (short)((unsigned)(v - SHRT_MIN) <= (unsigned)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); }
|
||||
template<> inline short saturate_cast<short>(unsigned v) { return (short)std::min(v, (unsigned)SHRT_MAX); }
|
||||
template<> inline short saturate_cast<short>(float v) { int iv = cvRound(v); return saturate_cast<short>(iv); }
|
||||
template<> inline short saturate_cast<short>(double v) { int iv = cvRound(v); return saturate_cast<short>(iv); }
|
||||
template<> inline short saturate_cast<short>(int64 v) { return (short)((uint64)((int64)v - SHRT_MIN) <= (uint64)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); }
|
||||
template<> inline short saturate_cast<short>(uint64 v) { return (short)std::min(v, (uint64)SHRT_MAX); }
|
||||
|
||||
template<> inline int saturate_cast<int>(float v) { return cvRound(v); }
|
||||
template<> inline int saturate_cast<int>(double v) { return cvRound(v); }
|
||||
|
||||
// we intentionally do not clip negative numbers, to make -1 become 0xffffffff etc.
|
||||
template<> inline unsigned saturate_cast<unsigned>(float v) { return cvRound(v); }
|
||||
template<> inline unsigned saturate_cast<unsigned>(double v) { return cvRound(v); }
|
||||
|
||||
//! @endcond
|
||||
|
||||
//////////////////////////////// low-level functions ////////////////////////////////
|
||||
|
||||
CV_EXPORTS int LU(float* A, size_t astep, int m, float* b, size_t bstep, int n);
|
||||
CV_EXPORTS int LU(double* A, size_t astep, int m, double* b, size_t bstep, int n);
|
||||
CV_EXPORTS bool Cholesky(float* A, size_t astep, int m, float* b, size_t bstep, int n);
|
||||
CV_EXPORTS bool Cholesky(double* A, size_t astep, int m, double* b, size_t bstep, int n);
|
||||
|
||||
CV_EXPORTS int normL1_(const uchar* a, const uchar* b, int n);
|
||||
CV_EXPORTS float normL1_(const float* a, const float* b, int n);
|
||||
CV_EXPORTS float normL2Sqr_(const float* a, const float* b, int n);
|
||||
|
||||
CV_EXPORTS void exp(const float* src, float* dst, int n);
|
||||
CV_EXPORTS void log(const float* src, float* dst, int n);
|
||||
|
||||
CV_EXPORTS void fastAtan2(const float* y, const float* x, float* dst, int n, bool angleInDegrees);
|
||||
CV_EXPORTS void magnitude(const float* x, const float* y, float* dst, int n);
|
||||
|
||||
/** @brief Computes the cube root of an argument.
|
||||
|
||||
The function cubeRoot computes \f$\sqrt[3]{\texttt{val}}\f$. Negative arguments are handled correctly.
|
||||
NaN and Inf are not handled. The accuracy approaches the maximum possible accuracy for
|
||||
single-precision data.
|
||||
@param val A function argument.
|
||||
*/
|
||||
CV_EXPORTS_W float cubeRoot(float val);
|
||||
|
||||
/** @brief Calculates the angle of a 2D vector in degrees.
|
||||
|
||||
The function fastAtan2 calculates the full-range angle of an input 2D vector. The angle is measured
|
||||
in degrees and varies from 0 to 360 degrees. The accuracy is about 0.3 degrees.
|
||||
@param x x-coordinate of the vector.
|
||||
@param y y-coordinate of the vector.
|
||||
*/
|
||||
CV_EXPORTS_W float fastAtan2(float y, float x);
|
||||
|
||||
/*
|
||||
* Hamming distance functor - counts the bit differences between two strings - useful for the Brief descriptor
|
||||
* bit count of A exclusive XOR'ed with B
|
||||
@ -549,6 +420,11 @@ typedef Hamming HammingLUT;
|
||||
|
||||
/////////////////////////////////// inline norms ////////////////////////////////////
|
||||
|
||||
template<typename _Tp> inline _Tp cv_abs(_Tp x) { return std::abs(x); }
|
||||
inline int cv_abs(uchar x) { return x; }
|
||||
inline int cv_abs(schar x) { return std::abs(x); }
|
||||
inline int cv_abs(ushort x) { return x; }
|
||||
inline int cv_abs(short x) { return std::abs(x); }
|
||||
|
||||
template<typename _Tp, typename _AccTp> static inline
|
||||
_AccTp normL2Sqr(const _Tp* a, int n)
|
||||
@ -578,12 +454,12 @@ _AccTp normL1(const _Tp* a, int n)
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for(; i <= n - 4; i += 4 )
|
||||
{
|
||||
s += (_AccTp)std::abs(a[i]) + (_AccTp)std::abs(a[i+1]) +
|
||||
(_AccTp)std::abs(a[i+2]) + (_AccTp)std::abs(a[i+3]);
|
||||
s += (_AccTp)cv_abs(a[i]) + (_AccTp)cv_abs(a[i+1]) +
|
||||
(_AccTp)cv_abs(a[i+2]) + (_AccTp)cv_abs(a[i+3]);
|
||||
}
|
||||
#endif
|
||||
for( ; i < n; i++ )
|
||||
s += std::abs(a[i]);
|
||||
s += cv_abs(a[i]);
|
||||
return s;
|
||||
}
|
||||
|
||||
@ -592,7 +468,7 @@ _AccTp normInf(const _Tp* a, int n)
|
||||
{
|
||||
_AccTp s = 0;
|
||||
for( int i = 0; i < n; i++ )
|
||||
s = std::max(s, (_AccTp)std::abs(a[i]));
|
||||
s = std::max(s, (_AccTp)cv_abs(a[i]));
|
||||
return s;
|
||||
}
|
||||
|
||||
@ -616,11 +492,10 @@ _AccTp normL2Sqr(const _Tp* a, const _Tp* b, int n)
|
||||
return s;
|
||||
}
|
||||
|
||||
template<> inline
|
||||
float normL2Sqr(const float* a, const float* b, int n)
|
||||
inline float normL2Sqr(const float* a, const float* b, int n)
|
||||
{
|
||||
if( n >= 8 )
|
||||
return normL2Sqr_(a, b, n);
|
||||
return hal::normL2Sqr_(a, b, n);
|
||||
float s = 0;
|
||||
for( int i = 0; i < n; i++ )
|
||||
{
|
||||
@ -650,11 +525,10 @@ _AccTp normL1(const _Tp* a, const _Tp* b, int n)
|
||||
return s;
|
||||
}
|
||||
|
||||
template<> inline
|
||||
float normL1(const float* a, const float* b, int n)
|
||||
inline float normL1(const float* a, const float* b, int n)
|
||||
{
|
||||
if( n >= 8 )
|
||||
return normL1_(a, b, n);
|
||||
return hal::normL1_(a, b, n);
|
||||
float s = 0;
|
||||
for( int i = 0; i < n; i++ )
|
||||
{
|
||||
@ -664,10 +538,9 @@ float normL1(const float* a, const float* b, int n)
|
||||
return s;
|
||||
}
|
||||
|
||||
template<> inline
|
||||
int normL1(const uchar* a, const uchar* b, int n)
|
||||
inline int normL1(const uchar* a, const uchar* b, int n)
|
||||
{
|
||||
return normL1_(a, b, n);
|
||||
return hal::normL1_(a, b, n);
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _AccTp> static inline
|
||||
@ -682,6 +555,23 @@ _AccTp normInf(const _Tp* a, const _Tp* b, int n)
|
||||
return s;
|
||||
}
|
||||
|
||||
/** @brief Computes the cube root of an argument.
|
||||
|
||||
The function cubeRoot computes \f$\sqrt[3]{\texttt{val}}\f$. Negative arguments are handled correctly.
|
||||
NaN and Inf are not handled. The accuracy approaches the maximum possible accuracy for
|
||||
single-precision data.
|
||||
@param val A function argument.
|
||||
*/
|
||||
CV_EXPORTS_W float cubeRoot(float val);
|
||||
|
||||
/** @brief Calculates the angle of a 2D vector in degrees.
|
||||
|
||||
The function fastAtan2 calculates the full-range angle of an input 2D vector. The angle is measured
|
||||
in degrees and varies from 0 to 360 degrees. The accuracy is about 0.3 degrees.
|
||||
@param x x-coordinate of the vector.
|
||||
@param y y-coordinate of the vector.
|
||||
*/
|
||||
CV_EXPORTS_W float fastAtan2(float y, float x);
|
||||
|
||||
////////////////// forward declarations for important OpenCV types //////////////////
|
||||
|
||||
|
@ -70,16 +70,6 @@
|
||||
# define CV_EXPORTS
|
||||
#endif
|
||||
|
||||
#ifndef CV_INLINE
|
||||
# if defined __cplusplus
|
||||
# define CV_INLINE static inline
|
||||
# elif defined _MSC_VER
|
||||
# define CV_INLINE __inline
|
||||
# else
|
||||
# define CV_INLINE static
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef CV_EXTERN_C
|
||||
# ifdef __cplusplus
|
||||
# define CV_EXTERN_C extern "C"
|
||||
@ -186,19 +176,6 @@
|
||||
#define CV_ELEM_SIZE(type) \
|
||||
(CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
|
||||
|
||||
|
||||
/****************************************************************************************\
|
||||
* fast math *
|
||||
\****************************************************************************************/
|
||||
|
||||
#if defined __BORLANDC__
|
||||
# include <fastmath.h>
|
||||
#elif defined __cplusplus
|
||||
# include <cmath>
|
||||
#else
|
||||
# include <math.h>
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
# define MIN(a,b) ((a) > (b) ? (b) : (a))
|
||||
#endif
|
||||
@ -207,164 +184,6 @@
|
||||
# define MAX(a,b) ((a) < (b) ? (b) : (a))
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TEGRA_OPTIMIZATION
|
||||
# include "tegra_round.hpp"
|
||||
#endif
|
||||
|
||||
//! @addtogroup core_utils
|
||||
//! @{
|
||||
|
||||
#if CV_VFP
|
||||
// 1. general scheme
|
||||
#define ARM_ROUND(_value, _asm_string) \
|
||||
int res; \
|
||||
float temp; \
|
||||
asm(_asm_string : [res] "=r" (res), [temp] "=w" (temp) : [value] "w" (_value)); \
|
||||
return res;
|
||||
// 2. version for double
|
||||
#ifdef __clang__
|
||||
#define ARM_ROUND_DBL(value) ARM_ROUND(value, "vcvtr.s32.f64 %[temp], %[value] \n vmov %[res], %[temp]")
|
||||
#else
|
||||
#define ARM_ROUND_DBL(value) ARM_ROUND(value, "vcvtr.s32.f64 %[temp], %P[value] \n vmov %[res], %[temp]")
|
||||
#endif
|
||||
// 3. version for float
|
||||
#define ARM_ROUND_FLT(value) ARM_ROUND(value, "vcvtr.s32.f32 %[temp], %[value]\n vmov %[res], %[temp]")
|
||||
#endif // CV_VFP
|
||||
|
||||
/** @brief Rounds floating-point number to the nearest integer
|
||||
|
||||
@param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the
|
||||
result is not defined.
|
||||
*/
|
||||
CV_INLINE int cvRound( double value )
|
||||
{
|
||||
#if ((defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__ && defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
|
||||
__m128d t = _mm_set_sd( value );
|
||||
return _mm_cvtsd_si32(t);
|
||||
#elif defined _MSC_VER && defined _M_IX86
|
||||
int t;
|
||||
__asm
|
||||
{
|
||||
fld value;
|
||||
fistp t;
|
||||
}
|
||||
return t;
|
||||
#elif ((defined _MSC_VER && defined _M_ARM) || defined CV_ICC || defined __GNUC__) && defined HAVE_TEGRA_OPTIMIZATION
|
||||
TEGRA_ROUND_DBL(value);
|
||||
#elif defined CV_ICC || defined __GNUC__
|
||||
# if CV_VFP
|
||||
ARM_ROUND_DBL(value)
|
||||
# else
|
||||
return (int)lrint(value);
|
||||
# endif
|
||||
#else
|
||||
double intpart, fractpart;
|
||||
fractpart = modf(value, &intpart);
|
||||
if ((fabs(fractpart) != 0.5) || ((((int)intpart) % 2) != 0))
|
||||
return (int)(value + (value >= 0 ? 0.5 : -0.5));
|
||||
else
|
||||
return (int)intpart;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvRound(float value)
|
||||
{
|
||||
#if defined ANDROID && (defined CV_ICC || defined __GNUC__) && defined HAVE_TEGRA_OPTIMIZATION
|
||||
TEGRA_ROUND_FLT(value);
|
||||
#elif CV_VFP && !defined HAVE_TEGRA_OPTIMIZATION
|
||||
ARM_ROUND_FLT(value)
|
||||
#else
|
||||
return cvRound((double)value);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvRound(int value)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
/** @brief Rounds floating-point number to the nearest integer not larger than the original.
|
||||
|
||||
The function computes an integer i such that:
|
||||
\f[i \le \texttt{value} < i+1\f]
|
||||
@param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the
|
||||
result is not defined.
|
||||
*/
|
||||
CV_INLINE int cvFloor( double value )
|
||||
{
|
||||
#if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
|
||||
__m128d t = _mm_set_sd( value );
|
||||
int i = _mm_cvtsd_si32(t);
|
||||
return i - _mm_movemask_pd(_mm_cmplt_sd(t, _mm_cvtsi32_sd(t,i)));
|
||||
#elif defined __GNUC__
|
||||
int i = (int)value;
|
||||
return i - (i > value);
|
||||
#else
|
||||
int i = cvRound(value);
|
||||
float diff = (float)(value - i);
|
||||
return i - (diff < 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** @brief Rounds floating-point number to the nearest integer not larger than the original.
|
||||
|
||||
The function computes an integer i such that:
|
||||
\f[i \le \texttt{value} < i+1\f]
|
||||
@param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the
|
||||
result is not defined.
|
||||
*/
|
||||
CV_INLINE int cvCeil( double value )
|
||||
{
|
||||
#if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__&& !defined __APPLE__)) && !defined(__CUDACC__)
|
||||
__m128d t = _mm_set_sd( value );
|
||||
int i = _mm_cvtsd_si32(t);
|
||||
return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i), t));
|
||||
#elif defined __GNUC__
|
||||
int i = (int)value;
|
||||
return i + (i < value);
|
||||
#else
|
||||
int i = cvRound(value);
|
||||
float diff = (float)(i - value);
|
||||
return i + (diff < 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** @brief Determines if the argument is Not A Number.
|
||||
|
||||
@param value The input floating-point value
|
||||
|
||||
The function returns 1 if the argument is Not A Number (as defined by IEEE754 standard), 0
|
||||
otherwise. */
|
||||
CV_INLINE int cvIsNaN( double value )
|
||||
{
|
||||
union { uint64 u; double f; } ieee754;
|
||||
ieee754.f = value;
|
||||
return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) +
|
||||
((unsigned)ieee754.u != 0) > 0x7ff00000;
|
||||
}
|
||||
|
||||
/** @brief Determines if the argument is Infinity.
|
||||
|
||||
@param value The input floating-point value
|
||||
|
||||
The function returns 1 if the argument is a plus or minus infinity (as defined by IEEE754 standard)
|
||||
and 0 otherwise. */
|
||||
CV_INLINE int cvIsInf( double value )
|
||||
{
|
||||
union { uint64 u; double f; } ieee754;
|
||||
ieee754.f = value;
|
||||
return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&
|
||||
(unsigned)ieee754.u == 0;
|
||||
}
|
||||
|
||||
//! @} core_utils
|
||||
|
||||
/****************************************************************************************\
|
||||
* exchange-add operation for atomic operations on reference counters *
|
||||
\****************************************************************************************/
|
||||
|
@ -427,7 +427,7 @@ template<typename _Tp, int m> struct Matx_DetOp
|
||||
double operator ()(const Matx<_Tp, m, m>& a) const
|
||||
{
|
||||
Matx<_Tp, m, m> temp = a;
|
||||
double p = LU(temp.val, m*sizeof(_Tp), m, 0, 0, 0);
|
||||
double p = hal::LU(temp.val, m*sizeof(_Tp), m, 0, 0, 0);
|
||||
if( p == 0 )
|
||||
return p;
|
||||
for( int i = 0; i < m; i++ )
|
||||
|
@ -72,9 +72,9 @@ template<typename _Tp, int m> struct Matx_FastInvOp
|
||||
b(i, i) = (_Tp)1;
|
||||
|
||||
if( method == DECOMP_CHOLESKY )
|
||||
return Cholesky(temp.val, m*sizeof(_Tp), m, b.val, m*sizeof(_Tp), m);
|
||||
return hal::Cholesky(temp.val, m*sizeof(_Tp), m, b.val, m*sizeof(_Tp), m);
|
||||
|
||||
return LU(temp.val, m*sizeof(_Tp), m, b.val, m*sizeof(_Tp), m) != 0;
|
||||
return hal::LU(temp.val, m*sizeof(_Tp), m, b.val, m*sizeof(_Tp), m) != 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -136,14 +136,6 @@ namespace cv
|
||||
/* the alignment of all the allocated buffers */
|
||||
#define CV_MALLOC_ALIGN 16
|
||||
|
||||
#ifdef __GNUC__
|
||||
# define CV_DECL_ALIGNED(x) __attribute__ ((aligned (x)))
|
||||
#elif defined _MSC_VER
|
||||
# define CV_DECL_ALIGNED(x) __declspec(align(x))
|
||||
#else
|
||||
# define CV_DECL_ALIGNED(x)
|
||||
#endif
|
||||
|
||||
/* IEEE754 constants and macros */
|
||||
#define CV_TOGGLE_FLT(x) ((x)^((int)(x) < 0 ? 0x7fffffff : 0))
|
||||
#define CV_TOGGLE_DBL(x) ((x)^((int64)(x) < 0 ? CV_BIG_INT(0x7fffffffffffffff) : 0))
|
||||
|
@ -113,22 +113,6 @@ bytes of the header. In C++ interface the role of CvArr is played by InputArray
|
||||
*/
|
||||
typedef void CvArr;
|
||||
|
||||
typedef union Cv32suf
|
||||
{
|
||||
int i;
|
||||
unsigned u;
|
||||
float f;
|
||||
}
|
||||
Cv32suf;
|
||||
|
||||
typedef union Cv64suf
|
||||
{
|
||||
int64 i;
|
||||
uint64 u;
|
||||
double f;
|
||||
}
|
||||
Cv64suf;
|
||||
|
||||
typedef int CVStatus;
|
||||
|
||||
/** @see cv::Error::Code */
|
||||
|
@ -79,7 +79,7 @@ public:
|
||||
|
||||
for ( int i = begin; i<end; i++ )
|
||||
{
|
||||
tdist2[i] = std::min(normL2Sqr_(data + step*i, data + stepci, dims), dist[i]);
|
||||
tdist2[i] = std::min(normL2Sqr(data + step*i, data + stepci, dims), dist[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -114,7 +114,7 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers,
|
||||
|
||||
for( i = 0; i < N; i++ )
|
||||
{
|
||||
dist[i] = normL2Sqr_(data + step*i, data + step*centers[0], dims);
|
||||
dist[i] = normL2Sqr(data + step*i, data + step*centers[0], dims);
|
||||
sum0 += dist[i];
|
||||
}
|
||||
|
||||
@ -189,7 +189,7 @@ public:
|
||||
for( int k = 0; k < K; k++ )
|
||||
{
|
||||
const float* center = centers.ptr<float>(k);
|
||||
const double dist = normL2Sqr_(sample, center, dims);
|
||||
const double dist = normL2Sqr(sample, center, dims);
|
||||
|
||||
if( min_dist > dist )
|
||||
{
|
||||
@ -384,7 +384,7 @@ double cv::kmeans( InputArray _data, int K,
|
||||
if( labels[i] != max_k )
|
||||
continue;
|
||||
sample = data.ptr<float>(i);
|
||||
double dist = normL2Sqr_(sample, _old_center, dims);
|
||||
double dist = normL2Sqr(sample, _old_center, dims);
|
||||
|
||||
if( max_dist <= dist )
|
||||
{
|
||||
|
@ -50,168 +50,6 @@
|
||||
namespace cv
|
||||
{
|
||||
|
||||
/****************************************************************************************\
|
||||
* LU & Cholesky implementation for small matrices *
|
||||
\****************************************************************************************/
|
||||
|
||||
template<typename _Tp> static inline int
|
||||
LUImpl(_Tp* A, size_t astep, int m, _Tp* b, size_t bstep, int n)
|
||||
{
|
||||
int i, j, k, p = 1;
|
||||
astep /= sizeof(A[0]);
|
||||
bstep /= sizeof(b[0]);
|
||||
|
||||
for( i = 0; i < m; i++ )
|
||||
{
|
||||
k = i;
|
||||
|
||||
for( j = i+1; j < m; j++ )
|
||||
if( std::abs(A[j*astep + i]) > std::abs(A[k*astep + i]) )
|
||||
k = j;
|
||||
|
||||
if( std::abs(A[k*astep + i]) < std::numeric_limits<_Tp>::epsilon() )
|
||||
return 0;
|
||||
|
||||
if( k != i )
|
||||
{
|
||||
for( j = i; j < m; j++ )
|
||||
std::swap(A[i*astep + j], A[k*astep + j]);
|
||||
if( b )
|
||||
for( j = 0; j < n; j++ )
|
||||
std::swap(b[i*bstep + j], b[k*bstep + j]);
|
||||
p = -p;
|
||||
}
|
||||
|
||||
_Tp d = -1/A[i*astep + i];
|
||||
|
||||
for( j = i+1; j < m; j++ )
|
||||
{
|
||||
_Tp alpha = A[j*astep + i]*d;
|
||||
|
||||
for( k = i+1; k < m; k++ )
|
||||
A[j*astep + k] += alpha*A[i*astep + k];
|
||||
|
||||
if( b )
|
||||
for( k = 0; k < n; k++ )
|
||||
b[j*bstep + k] += alpha*b[i*bstep + k];
|
||||
}
|
||||
|
||||
A[i*astep + i] = -d;
|
||||
}
|
||||
|
||||
if( b )
|
||||
{
|
||||
for( i = m-1; i >= 0; i-- )
|
||||
for( j = 0; j < n; j++ )
|
||||
{
|
||||
_Tp s = b[i*bstep + j];
|
||||
for( k = i+1; k < m; k++ )
|
||||
s -= A[i*astep + k]*b[k*bstep + j];
|
||||
b[i*bstep + j] = s*A[i*astep + i];
|
||||
}
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
int LU(float* A, size_t astep, int m, float* b, size_t bstep, int n)
|
||||
{
|
||||
return LUImpl(A, astep, m, b, bstep, n);
|
||||
}
|
||||
|
||||
|
||||
int LU(double* A, size_t astep, int m, double* b, size_t bstep, int n)
|
||||
{
|
||||
return LUImpl(A, astep, m, b, bstep, n);
|
||||
}
|
||||
|
||||
|
||||
template<typename _Tp> static inline bool
|
||||
CholImpl(_Tp* A, size_t astep, int m, _Tp* b, size_t bstep, int n)
|
||||
{
|
||||
_Tp* L = A;
|
||||
int i, j, k;
|
||||
double s;
|
||||
astep /= sizeof(A[0]);
|
||||
bstep /= sizeof(b[0]);
|
||||
|
||||
for( i = 0; i < m; i++ )
|
||||
{
|
||||
for( j = 0; j < i; j++ )
|
||||
{
|
||||
s = A[i*astep + j];
|
||||
for( k = 0; k < j; k++ )
|
||||
s -= L[i*astep + k]*L[j*astep + k];
|
||||
L[i*astep + j] = (_Tp)(s*L[j*astep + j]);
|
||||
}
|
||||
s = A[i*astep + i];
|
||||
for( k = 0; k < j; k++ )
|
||||
{
|
||||
double t = L[i*astep + k];
|
||||
s -= t*t;
|
||||
}
|
||||
if( s < std::numeric_limits<_Tp>::epsilon() )
|
||||
return false;
|
||||
L[i*astep + i] = (_Tp)(1./std::sqrt(s));
|
||||
}
|
||||
|
||||
if( !b )
|
||||
return true;
|
||||
|
||||
// LLt x = b
|
||||
// 1: L y = b
|
||||
// 2. Lt x = y
|
||||
|
||||
/*
|
||||
[ L00 ] y0 b0
|
||||
[ L10 L11 ] y1 = b1
|
||||
[ L20 L21 L22 ] y2 b2
|
||||
[ L30 L31 L32 L33 ] y3 b3
|
||||
|
||||
[ L00 L10 L20 L30 ] x0 y0
|
||||
[ L11 L21 L31 ] x1 = y1
|
||||
[ L22 L32 ] x2 y2
|
||||
[ L33 ] x3 y3
|
||||
*/
|
||||
|
||||
for( i = 0; i < m; i++ )
|
||||
{
|
||||
for( j = 0; j < n; j++ )
|
||||
{
|
||||
s = b[i*bstep + j];
|
||||
for( k = 0; k < i; k++ )
|
||||
s -= L[i*astep + k]*b[k*bstep + j];
|
||||
b[i*bstep + j] = (_Tp)(s*L[i*astep + i]);
|
||||
}
|
||||
}
|
||||
|
||||
for( i = m-1; i >= 0; i-- )
|
||||
{
|
||||
for( j = 0; j < n; j++ )
|
||||
{
|
||||
s = b[i*bstep + j];
|
||||
for( k = m-1; k > i; k-- )
|
||||
s -= L[k*astep + i]*b[k*bstep + j];
|
||||
b[i*bstep + j] = (_Tp)(s*L[i*astep + i]);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Cholesky(float* A, size_t astep, int m, float* b, size_t bstep, int n)
|
||||
{
|
||||
return CholImpl(A, astep, m, b, bstep, n);
|
||||
}
|
||||
|
||||
bool Cholesky(double* A, size_t astep, int m, double* b, size_t bstep, int n)
|
||||
{
|
||||
return CholImpl(A, astep, m, b, bstep, n);
|
||||
}
|
||||
|
||||
|
||||
template<typename _Tp> static inline _Tp hypot(_Tp a, _Tp b)
|
||||
{
|
||||
a = std::abs(a);
|
||||
@ -882,7 +720,7 @@ double cv::determinant( InputArray _mat )
|
||||
Mat a(rows, rows, CV_32F, (uchar*)buffer);
|
||||
mat.copyTo(a);
|
||||
|
||||
result = LU(a.ptr<float>(), a.step, rows, 0, 0, 0);
|
||||
result = hal::LU(a.ptr<float>(), a.step, rows, 0, 0, 0);
|
||||
if( result )
|
||||
{
|
||||
for( int i = 0; i < rows; i++ )
|
||||
@ -906,7 +744,7 @@ double cv::determinant( InputArray _mat )
|
||||
Mat a(rows, rows, CV_64F, (uchar*)buffer);
|
||||
mat.copyTo(a);
|
||||
|
||||
result = LU(a.ptr<double>(), a.step, rows, 0, 0, 0);
|
||||
result = hal::LU(a.ptr<double>(), a.step, rows, 0, 0, 0);
|
||||
if( result )
|
||||
{
|
||||
for( int i = 0; i < rows; i++ )
|
||||
@ -1169,13 +1007,13 @@ double cv::invert( InputArray _src, OutputArray _dst, int method )
|
||||
setIdentity(dst);
|
||||
|
||||
if( method == DECOMP_LU && type == CV_32F )
|
||||
result = LU(src1.ptr<float>(), src1.step, n, dst.ptr<float>(), dst.step, n) != 0;
|
||||
result = hal::LU(src1.ptr<float>(), src1.step, n, dst.ptr<float>(), dst.step, n) != 0;
|
||||
else if( method == DECOMP_LU && type == CV_64F )
|
||||
result = LU(src1.ptr<double>(), src1.step, n, dst.ptr<double>(), dst.step, n) != 0;
|
||||
result = hal::LU(src1.ptr<double>(), src1.step, n, dst.ptr<double>(), dst.step, n) != 0;
|
||||
else if( method == DECOMP_CHOLESKY && type == CV_32F )
|
||||
result = Cholesky(src1.ptr<float>(), src1.step, n, dst.ptr<float>(), dst.step, n);
|
||||
result = hal::Cholesky(src1.ptr<float>(), src1.step, n, dst.ptr<float>(), dst.step, n);
|
||||
else
|
||||
result = Cholesky(src1.ptr<double>(), src1.step, n, dst.ptr<double>(), dst.step, n);
|
||||
result = hal::Cholesky(src1.ptr<double>(), src1.step, n, dst.ptr<double>(), dst.step, n);
|
||||
|
||||
if( !result )
|
||||
dst = Scalar(0);
|
||||
@ -1407,16 +1245,16 @@ bool cv::solve( InputArray _src, InputArray _src2arg, OutputArray _dst, int meth
|
||||
if( method == DECOMP_LU )
|
||||
{
|
||||
if( type == CV_32F )
|
||||
result = LU(a.ptr<float>(), a.step, n, dst.ptr<float>(), dst.step, nb) != 0;
|
||||
result = hal::LU(a.ptr<float>(), a.step, n, dst.ptr<float>(), dst.step, nb) != 0;
|
||||
else
|
||||
result = LU(a.ptr<double>(), a.step, n, dst.ptr<double>(), dst.step, nb) != 0;
|
||||
result = hal::LU(a.ptr<double>(), a.step, n, dst.ptr<double>(), dst.step, nb) != 0;
|
||||
}
|
||||
else if( method == DECOMP_CHOLESKY )
|
||||
{
|
||||
if( type == CV_32F )
|
||||
result = Cholesky(a.ptr<float>(), a.step, n, dst.ptr<float>(), dst.step, nb);
|
||||
result = hal::Cholesky(a.ptr<float>(), a.step, n, dst.ptr<float>(), dst.step, nb);
|
||||
else
|
||||
result = Cholesky(a.ptr<double>(), a.step, n, dst.ptr<double>(), dst.step, nb);
|
||||
result = hal::Cholesky(a.ptr<double>(), a.step, n, dst.ptr<double>(), dst.step, nb);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -43,9 +43,9 @@
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace
|
||||
namespace cv
|
||||
{
|
||||
class FormattedImpl : public cv::Formatted
|
||||
class FormattedImpl : public Formatted
|
||||
{
|
||||
enum { STATE_PROLOGUE, STATE_EPILOGUE, STATE_INTERLUDE,
|
||||
STATE_ROW_OPEN, STATE_ROW_CLOSE, STATE_CN_OPEN, STATE_CN_CLOSE, STATE_VALUE, STATE_FINISHED,
|
||||
@ -55,7 +55,7 @@ namespace
|
||||
char floatFormat[8];
|
||||
char buf[32]; // enough for double with precision up to 20
|
||||
|
||||
cv::Mat mtx;
|
||||
Mat mtx;
|
||||
int mcn; // == mtx.channels()
|
||||
bool singleLine;
|
||||
bool alignOrder; // true when cn first order
|
||||
@ -65,8 +65,8 @@ namespace
|
||||
int col;
|
||||
int cn;
|
||||
|
||||
cv::String prologue;
|
||||
cv::String epilogue;
|
||||
String prologue;
|
||||
String epilogue;
|
||||
char braces[5];
|
||||
|
||||
void (FormattedImpl::*valueToStr)();
|
||||
@ -81,7 +81,7 @@ namespace
|
||||
|
||||
public:
|
||||
|
||||
FormattedImpl(cv::String pl, cv::String el, cv::Mat m, char br[5], bool sLine, bool aOrder, int precision)
|
||||
FormattedImpl(String pl, String el, Mat m, char br[5], bool sLine, bool aOrder, int precision)
|
||||
{
|
||||
CV_Assert(m.dims <= 2);
|
||||
|
||||
@ -253,7 +253,7 @@ namespace
|
||||
}
|
||||
};
|
||||
|
||||
class FormatterBase : public cv::Formatter
|
||||
class FormatterBase : public Formatter
|
||||
{
|
||||
public:
|
||||
FormatterBase() : prec32f(8), prec64f(16), multiline(true) {}
|
||||
@ -278,14 +278,15 @@ namespace
|
||||
int prec64f;
|
||||
int multiline;
|
||||
};
|
||||
|
||||
class DefaultFormatter : public FormatterBase
|
||||
{
|
||||
public:
|
||||
|
||||
cv::Ptr<cv::Formatted> format(const cv::Mat& mtx) const
|
||||
Ptr<Formatted> format(const Mat& mtx) const
|
||||
{
|
||||
char braces[5] = {'\0', '\0', ';', '\0', '\0'};
|
||||
return cv::makePtr<FormattedImpl>("[", "]", mtx, &*braces,
|
||||
return makePtr<FormattedImpl>("[", "]", mtx, &*braces,
|
||||
mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
|
||||
}
|
||||
};
|
||||
@ -294,10 +295,10 @@ namespace
|
||||
{
|
||||
public:
|
||||
|
||||
cv::Ptr<cv::Formatted> format(const cv::Mat& mtx) const
|
||||
Ptr<Formatted> format(const Mat& mtx) const
|
||||
{
|
||||
char braces[5] = {'\0', '\0', ';', '\0', '\0'};
|
||||
return cv::makePtr<FormattedImpl>("", "", mtx, &*braces,
|
||||
return makePtr<FormattedImpl>("", "", mtx, &*braces,
|
||||
mtx.rows == 1 || !multiline, true, mtx.depth() == CV_64F ? prec64f : prec32f );
|
||||
}
|
||||
};
|
||||
@ -306,12 +307,12 @@ namespace
|
||||
{
|
||||
public:
|
||||
|
||||
cv::Ptr<cv::Formatted> format(const cv::Mat& mtx) const
|
||||
Ptr<Formatted> format(const Mat& mtx) const
|
||||
{
|
||||
char braces[5] = {'[', ']', '\0', '[', ']'};
|
||||
char braces[5] = {'[', ']', ',', '[', ']'};
|
||||
if (mtx.cols == 1)
|
||||
braces[0] = braces[1] = '\0';
|
||||
return cv::makePtr<FormattedImpl>("[", "]", mtx, &*braces,
|
||||
return makePtr<FormattedImpl>("[", "]", mtx, &*braces,
|
||||
mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
|
||||
}
|
||||
};
|
||||
@ -320,17 +321,17 @@ namespace
|
||||
{
|
||||
public:
|
||||
|
||||
cv::Ptr<cv::Formatted> format(const cv::Mat& mtx) const
|
||||
Ptr<Formatted> format(const Mat& mtx) const
|
||||
{
|
||||
static const char* numpyTypes[] =
|
||||
{
|
||||
"uint8", "int8", "uint16", "int16", "int32", "float32", "float64", "uint64"
|
||||
};
|
||||
char braces[5] = {'[', ']', '\0', '[', ']'};
|
||||
char braces[5] = {'[', ']', ',', '[', ']'};
|
||||
if (mtx.cols == 1)
|
||||
braces[0] = braces[1] = '\0';
|
||||
return cv::makePtr<FormattedImpl>("array([",
|
||||
cv::format("], type='%s')", numpyTypes[mtx.depth()]), mtx, &*braces,
|
||||
return makePtr<FormattedImpl>("array([",
|
||||
cv::format("], dtype='%s')", numpyTypes[mtx.depth()]), mtx, &*braces,
|
||||
mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
|
||||
}
|
||||
};
|
||||
@ -339,11 +340,11 @@ namespace
|
||||
{
|
||||
public:
|
||||
|
||||
cv::Ptr<cv::Formatted> format(const cv::Mat& mtx) const
|
||||
Ptr<Formatted> format(const Mat& mtx) const
|
||||
{
|
||||
char braces[5] = {'\0', '\0', '\0', '\0', '\0'};
|
||||
return cv::makePtr<FormattedImpl>(cv::String(),
|
||||
mtx.rows > 1 ? cv::String("\n") : cv::String(), mtx, &*braces,
|
||||
return makePtr<FormattedImpl>(String(),
|
||||
mtx.rows > 1 ? String("\n") : String(), mtx, &*braces,
|
||||
mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
|
||||
}
|
||||
};
|
||||
@ -352,19 +353,14 @@ namespace
|
||||
{
|
||||
public:
|
||||
|
||||
cv::Ptr<cv::Formatted> format(const cv::Mat& mtx) const
|
||||
Ptr<Formatted> format(const Mat& mtx) const
|
||||
{
|
||||
char braces[5] = {'\0', '\0', ',', '\0', '\0'};
|
||||
return cv::makePtr<FormattedImpl>("{", "}", mtx, &*braces,
|
||||
return makePtr<FormattedImpl>("{", "}", mtx, &*braces,
|
||||
mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
namespace cv
|
||||
{
|
||||
Formatted::~Formatted() {}
|
||||
Formatter::~Formatter() {}
|
||||
|
||||
|
@ -2416,140 +2416,6 @@ void cv::minMaxLoc( InputArray _img, double* minVal, double* maxVal,
|
||||
namespace cv
|
||||
{
|
||||
|
||||
float normL2Sqr_(const float* a, const float* b, int n)
|
||||
{
|
||||
int j = 0; float d = 0.f;
|
||||
#if CV_SSE
|
||||
if( USE_SSE2 )
|
||||
{
|
||||
float CV_DECL_ALIGNED(16) buf[4];
|
||||
__m128 d0 = _mm_setzero_ps(), d1 = _mm_setzero_ps();
|
||||
|
||||
for( ; j <= n - 8; j += 8 )
|
||||
{
|
||||
__m128 t0 = _mm_sub_ps(_mm_loadu_ps(a + j), _mm_loadu_ps(b + j));
|
||||
__m128 t1 = _mm_sub_ps(_mm_loadu_ps(a + j + 4), _mm_loadu_ps(b + j + 4));
|
||||
d0 = _mm_add_ps(d0, _mm_mul_ps(t0, t0));
|
||||
d1 = _mm_add_ps(d1, _mm_mul_ps(t1, t1));
|
||||
}
|
||||
_mm_store_ps(buf, _mm_add_ps(d0, d1));
|
||||
d = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
for( ; j <= n - 4; j += 4 )
|
||||
{
|
||||
float t0 = a[j] - b[j], t1 = a[j+1] - b[j+1], t2 = a[j+2] - b[j+2], t3 = a[j+3] - b[j+3];
|
||||
d += t0*t0 + t1*t1 + t2*t2 + t3*t3;
|
||||
}
|
||||
}
|
||||
|
||||
for( ; j < n; j++ )
|
||||
{
|
||||
float t = a[j] - b[j];
|
||||
d += t*t;
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
float normL1_(const float* a, const float* b, int n)
|
||||
{
|
||||
int j = 0; float d = 0.f;
|
||||
#if CV_SSE
|
||||
if( USE_SSE2 )
|
||||
{
|
||||
float CV_DECL_ALIGNED(16) buf[4];
|
||||
static const int CV_DECL_ALIGNED(16) absbuf[4] = {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
|
||||
__m128 d0 = _mm_setzero_ps(), d1 = _mm_setzero_ps();
|
||||
__m128 absmask = _mm_load_ps((const float*)absbuf);
|
||||
|
||||
for( ; j <= n - 8; j += 8 )
|
||||
{
|
||||
__m128 t0 = _mm_sub_ps(_mm_loadu_ps(a + j), _mm_loadu_ps(b + j));
|
||||
__m128 t1 = _mm_sub_ps(_mm_loadu_ps(a + j + 4), _mm_loadu_ps(b + j + 4));
|
||||
d0 = _mm_add_ps(d0, _mm_and_ps(t0, absmask));
|
||||
d1 = _mm_add_ps(d1, _mm_and_ps(t1, absmask));
|
||||
}
|
||||
_mm_store_ps(buf, _mm_add_ps(d0, d1));
|
||||
d = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
}
|
||||
else
|
||||
#elif CV_NEON
|
||||
float32x4_t v_sum = vdupq_n_f32(0.0f);
|
||||
for ( ; j <= n - 4; j += 4)
|
||||
v_sum = vaddq_f32(v_sum, vabdq_f32(vld1q_f32(a + j), vld1q_f32(b + j)));
|
||||
|
||||
float CV_DECL_ALIGNED(16) buf[4];
|
||||
vst1q_f32(buf, v_sum);
|
||||
d = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
#endif
|
||||
{
|
||||
for( ; j <= n - 4; j += 4 )
|
||||
{
|
||||
d += std::abs(a[j] - b[j]) + std::abs(a[j+1] - b[j+1]) +
|
||||
std::abs(a[j+2] - b[j+2]) + std::abs(a[j+3] - b[j+3]);
|
||||
}
|
||||
}
|
||||
|
||||
for( ; j < n; j++ )
|
||||
d += std::abs(a[j] - b[j]);
|
||||
return d;
|
||||
}
|
||||
|
||||
int normL1_(const uchar* a, const uchar* b, int n)
|
||||
{
|
||||
int j = 0, d = 0;
|
||||
#if CV_SSE
|
||||
if( USE_SSE2 )
|
||||
{
|
||||
__m128i d0 = _mm_setzero_si128();
|
||||
|
||||
for( ; j <= n - 16; j += 16 )
|
||||
{
|
||||
__m128i t0 = _mm_loadu_si128((const __m128i*)(a + j));
|
||||
__m128i t1 = _mm_loadu_si128((const __m128i*)(b + j));
|
||||
|
||||
d0 = _mm_add_epi32(d0, _mm_sad_epu8(t0, t1));
|
||||
}
|
||||
|
||||
for( ; j <= n - 4; j += 4 )
|
||||
{
|
||||
__m128i t0 = _mm_cvtsi32_si128(*(const int*)(a + j));
|
||||
__m128i t1 = _mm_cvtsi32_si128(*(const int*)(b + j));
|
||||
|
||||
d0 = _mm_add_epi32(d0, _mm_sad_epu8(t0, t1));
|
||||
}
|
||||
d = _mm_cvtsi128_si32(_mm_add_epi32(d0, _mm_unpackhi_epi64(d0, d0)));
|
||||
}
|
||||
else
|
||||
#elif CV_NEON
|
||||
uint32x4_t v_sum = vdupq_n_u32(0.0f);
|
||||
for ( ; j <= n - 16; j += 16)
|
||||
{
|
||||
uint8x16_t v_dst = vabdq_u8(vld1q_u8(a + j), vld1q_u8(b + j));
|
||||
uint16x8_t v_low = vmovl_u8(vget_low_u8(v_dst)), v_high = vmovl_u8(vget_high_u8(v_dst));
|
||||
v_sum = vaddq_u32(v_sum, vaddl_u16(vget_low_u16(v_low), vget_low_u16(v_high)));
|
||||
v_sum = vaddq_u32(v_sum, vaddl_u16(vget_high_u16(v_low), vget_high_u16(v_high)));
|
||||
}
|
||||
|
||||
uint CV_DECL_ALIGNED(16) buf[4];
|
||||
vst1q_u32(buf, v_sum);
|
||||
d = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
#endif
|
||||
{
|
||||
for( ; j <= n - 4; j += 4 )
|
||||
{
|
||||
d += std::abs(a[j] - b[j]) + std::abs(a[j+1] - b[j+1]) +
|
||||
std::abs(a[j+2] - b[j+2]) + std::abs(a[j+3] - b[j+3]);
|
||||
}
|
||||
}
|
||||
for( ; j < n; j++ )
|
||||
d += std::abs(a[j] - b[j]);
|
||||
return d;
|
||||
}
|
||||
|
||||
template<typename T, typename ST> int
|
||||
normInf_(const T* src, const uchar* mask, ST* _result, int len, int cn)
|
||||
{
|
||||
@ -2564,7 +2430,7 @@ normInf_(const T* src, const uchar* mask, ST* _result, int len, int cn)
|
||||
if( mask[i] )
|
||||
{
|
||||
for( int k = 0; k < cn; k++ )
|
||||
result = std::max(result, ST(std::abs(src[k])));
|
||||
result = std::max(result, ST(cv_abs(src[k])));
|
||||
}
|
||||
}
|
||||
*_result = result;
|
||||
@ -2585,7 +2451,7 @@ normL1_(const T* src, const uchar* mask, ST* _result, int len, int cn)
|
||||
if( mask[i] )
|
||||
{
|
||||
for( int k = 0; k < cn; k++ )
|
||||
result += std::abs(src[k]);
|
||||
result += cv_abs(src[k]);
|
||||
}
|
||||
}
|
||||
*_result = result;
|
||||
@ -2684,9 +2550,7 @@ normDiffL2_(const T* src1, const T* src2, const uchar* mask, ST* _result, int le
|
||||
|
||||
Hamming::ResultType Hamming::operator()( const unsigned char* a, const unsigned char* b, int size ) const
|
||||
{
|
||||
int result = 0;
|
||||
cv::hal::normHamming(a, b, size, result);
|
||||
return result;
|
||||
return cv::hal::normHamming(a, b, size);
|
||||
}
|
||||
|
||||
#define CV_DEF_NORM_FUNC(L, suffix, type, ntype) \
|
||||
@ -3037,16 +2901,12 @@ double cv::norm( InputArray _src, int normType, InputArray _mask )
|
||||
|
||||
if( normType == NORM_HAMMING )
|
||||
{
|
||||
int result = 0;
|
||||
cv::hal::normHamming(data, (int)len, result);
|
||||
return result;
|
||||
return hal::normHamming(data, (int)len);
|
||||
}
|
||||
|
||||
if( normType == NORM_HAMMING2 )
|
||||
{
|
||||
int result = 0;
|
||||
hal::normHamming(data, (int)len, 2, result);
|
||||
return result;
|
||||
return hal::normHamming(data, (int)len, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3072,9 +2932,7 @@ double cv::norm( InputArray _src, int normType, InputArray _mask )
|
||||
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
{
|
||||
int one = 0;
|
||||
cv::hal::normHamming(ptrs[0], total, cellSize, one);
|
||||
result += one;
|
||||
result += hal::normHamming(ptrs[0], total, cellSize);
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -3558,9 +3416,7 @@ double cv::norm( InputArray _src1, InputArray _src2, int normType, InputArray _m
|
||||
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
{
|
||||
int one = 0;
|
||||
hal::normHamming(ptrs[0], ptrs[1], total, cellSize, one);
|
||||
result += one;
|
||||
result += hal::normHamming(ptrs[0], ptrs[1], total, cellSize);
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -3698,7 +3554,7 @@ static void batchDistHamming(const uchar* src1, const uchar* src2, size_t step2,
|
||||
if( !mask )
|
||||
{
|
||||
for( int i = 0; i < nvecs; i++ )
|
||||
hal::normHamming(src1, src2 + step2*i, len, dist[i]);
|
||||
dist[i] = hal::normHamming(src1, src2 + step2*i, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3706,7 +3562,7 @@ static void batchDistHamming(const uchar* src1, const uchar* src2, size_t step2,
|
||||
for( int i = 0; i < nvecs; i++ )
|
||||
{
|
||||
if (mask[i])
|
||||
hal::normHamming(src1, src2 + step2*i, len, dist[i]);
|
||||
dist[i] = hal::normHamming(src1, src2 + step2*i, len);
|
||||
else
|
||||
dist[i] = val0;
|
||||
}
|
||||
@ -3720,7 +3576,7 @@ static void batchDistHamming2(const uchar* src1, const uchar* src2, size_t step2
|
||||
if( !mask )
|
||||
{
|
||||
for( int i = 0; i < nvecs; i++ )
|
||||
hal::normHamming(src1, src2 + step2*i, len, 2, dist[i]);
|
||||
dist[i] = hal::normHamming(src1, src2 + step2*i, len, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3728,7 +3584,7 @@ static void batchDistHamming2(const uchar* src1, const uchar* src2, size_t step2
|
||||
for( int i = 0; i < nvecs; i++ )
|
||||
{
|
||||
if (mask[i])
|
||||
hal::normHamming(src1, src2 + step2*i, len, 2, dist[i]);
|
||||
dist[i] = hal::normHamming(src1, src2 + step2*i, len, 2);
|
||||
else
|
||||
dist[i] = val0;
|
||||
}
|
||||
|
@ -812,7 +812,7 @@ void AKAZEFeatures::Compute_Main_Orientation(KeyPoint& kpt, const std::vector<TE
|
||||
}
|
||||
}
|
||||
}
|
||||
fastAtan2(resY, resX, Ang, ang_size, false);
|
||||
hal::fastAtan2(resY, resX, Ang, ang_size, false);
|
||||
// Loop slides pi/3 window around feature point
|
||||
for (ang1 = 0; ang1 < (float)(2.0 * CV_PI); ang1 += 0.15f) {
|
||||
ang2 = (ang1 + (float)(CV_PI / 3.0) >(float)(2.0*CV_PI) ? ang1 - (float)(5.0*CV_PI / 3.0) : ang1 + (float)(CV_PI / 3.0));
|
||||
|
@ -55,7 +55,7 @@ namespace cv { namespace hal {
|
||||
|
||||
namespace Error {
|
||||
|
||||
enum Code
|
||||
enum
|
||||
{
|
||||
Ok = 0,
|
||||
Unknown = -1
|
||||
@ -63,11 +63,35 @@ enum Code
|
||||
|
||||
}
|
||||
|
||||
Error::Code normHamming(const uchar* a, int n, int & result);
|
||||
Error::Code normHamming(const uchar* a, const uchar* b, int n, int & result);
|
||||
int normHamming(const uchar* a, int n);
|
||||
int normHamming(const uchar* a, const uchar* b, int n);
|
||||
|
||||
Error::Code normHamming(const uchar* a, int n, int cellSize, int & result);
|
||||
Error::Code normHamming(const uchar* a, const uchar* b, int n, int cellSize, int & result);
|
||||
int normHamming(const uchar* a, int n, int cellSize);
|
||||
int normHamming(const uchar* a, const uchar* b, int n, int cellSize);
|
||||
|
||||
//////////////////////////////// low-level functions ////////////////////////////////
|
||||
|
||||
int LU(float* A, size_t astep, int m, float* b, size_t bstep, int n);
|
||||
int LU(double* A, size_t astep, int m, double* b, size_t bstep, int n);
|
||||
bool Cholesky(float* A, size_t astep, int m, float* b, size_t bstep, int n);
|
||||
bool Cholesky(double* A, size_t astep, int m, double* b, size_t bstep, int n);
|
||||
|
||||
int normL1_(const uchar* a, const uchar* b, int n);
|
||||
float normL1_(const float* a, const float* b, int n);
|
||||
float normL2Sqr_(const float* a, const float* b, int n);
|
||||
|
||||
void exp(const float* src, float* dst, int n);
|
||||
void exp(const double* src, double* dst, int n);
|
||||
void log(const float* src, float* dst, int n);
|
||||
void log(const double* src, double* dst, int n);
|
||||
|
||||
void fastAtan2(const float* y, const float* x, float* dst, int n, bool angleInDegrees);
|
||||
void magnitude(const float* x, const float* y, float* dst, int n);
|
||||
void magnitude(const double* x, const double* y, double* dst, int n);
|
||||
void sqrt(const float* src, float* dst, int len);
|
||||
void sqrt(const double* src, double* dst, int len);
|
||||
void invSqrt(const float* src, float* dst, int len);
|
||||
void invSqrt(const double* src, double* dst, int len);
|
||||
|
||||
}} //cv::hal
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
@ -48,6 +49,8 @@
|
||||
# define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio warnings */
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#if defined __ICL
|
||||
# define CV_ICC __ICL
|
||||
#elif defined __ICC
|
||||
@ -60,12 +63,30 @@
|
||||
# define CV_ICC __INTEL_COMPILER
|
||||
#endif
|
||||
|
||||
#ifndef CV_INLINE
|
||||
# if defined __cplusplus
|
||||
# define CV_INLINE static inline
|
||||
# elif defined _MSC_VER
|
||||
# define CV_INLINE __inline
|
||||
# else
|
||||
# define CV_INLINE static
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined CV_ICC && !defined CV_ENABLE_UNROLLED
|
||||
# define CV_ENABLE_UNROLLED 0
|
||||
#else
|
||||
# define CV_ENABLE_UNROLLED 1
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
# define CV_DECL_ALIGNED(x) __attribute__ ((aligned (x)))
|
||||
#elif defined _MSC_VER
|
||||
# define CV_DECL_ALIGNED(x) __declspec(align(x))
|
||||
#else
|
||||
# define CV_DECL_ALIGNED(x)
|
||||
#endif
|
||||
|
||||
/* CPU features and intrinsics support */
|
||||
#define CV_CPU_NONE 0
|
||||
#define CV_CPU_MMX 1
|
||||
@ -99,7 +120,7 @@
|
||||
// do not include SSE/AVX/NEON headers for NVCC compiler
|
||||
#ifndef __CUDACC__
|
||||
|
||||
#if defined __SSE2__ || defined _M_X64 || (defined _M_IX86_FP && _M_IX86_FP >= 2)
|
||||
#if defined __SSE2__ || defined _M_X64 || (defined _M_IX86_FP && _M_IX86_FP >= 2)
|
||||
# include <emmintrin.h>
|
||||
# define CV_MMX 1
|
||||
# define CV_SSE 1
|
||||
@ -281,4 +302,374 @@ typedef signed char schar;
|
||||
#define CV_2PI 6.283185307179586476925286766559
|
||||
#define CV_LOG2 0.69314718055994530941723212145818
|
||||
|
||||
typedef union Cv32suf
|
||||
{
|
||||
int i;
|
||||
unsigned u;
|
||||
float f;
|
||||
}
|
||||
Cv32suf;
|
||||
|
||||
typedef union Cv64suf
|
||||
{
|
||||
int64 i;
|
||||
uint64 u;
|
||||
double f;
|
||||
}
|
||||
Cv64suf;
|
||||
|
||||
|
||||
/****************************************************************************************\
|
||||
* fast math *
|
||||
\****************************************************************************************/
|
||||
|
||||
#if defined __BORLANDC__
|
||||
# include <fastmath.h>
|
||||
#elif defined __cplusplus
|
||||
# include <cmath>
|
||||
#else
|
||||
# include <math.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TEGRA_OPTIMIZATION
|
||||
# include "tegra_round.hpp"
|
||||
#endif
|
||||
|
||||
//! @addtogroup core_utils
|
||||
//! @{
|
||||
|
||||
#if CV_VFP
|
||||
// 1. general scheme
|
||||
#define ARM_ROUND(_value, _asm_string) \
|
||||
int res; \
|
||||
float temp; \
|
||||
asm(_asm_string : [res] "=r" (res), [temp] "=w" (temp) : [value] "w" (_value)); \
|
||||
return res
|
||||
// 2. version for double
|
||||
#ifdef __clang__
|
||||
#define ARM_ROUND_DBL(value) ARM_ROUND(value, "vcvtr.s32.f64 %[temp], %[value] \n vmov %[res], %[temp]")
|
||||
#else
|
||||
#define ARM_ROUND_DBL(value) ARM_ROUND(value, "vcvtr.s32.f64 %[temp], %P[value] \n vmov %[res], %[temp]")
|
||||
#endif
|
||||
// 3. version for float
|
||||
#define ARM_ROUND_FLT(value) ARM_ROUND(value, "vcvtr.s32.f32 %[temp], %[value]\n vmov %[res], %[temp]")
|
||||
#endif // CV_VFP
|
||||
|
||||
/** @brief Rounds floating-point number to the nearest integer
|
||||
|
||||
@param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the
|
||||
result is not defined.
|
||||
*/
|
||||
CV_INLINE int
|
||||
cvRound( double value )
|
||||
{
|
||||
#if ((defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__ \
|
||||
&& defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
|
||||
__m128d t = _mm_set_sd( value );
|
||||
return _mm_cvtsd_si32(t);
|
||||
#elif defined _MSC_VER && defined _M_IX86
|
||||
int t;
|
||||
__asm
|
||||
{
|
||||
fld value;
|
||||
fistp t;
|
||||
}
|
||||
return t;
|
||||
#elif ((defined _MSC_VER && defined _M_ARM) || defined CV_ICC || \
|
||||
defined __GNUC__) && defined HAVE_TEGRA_OPTIMIZATION
|
||||
TEGRA_ROUND_DBL(value);
|
||||
#elif defined CV_ICC || defined __GNUC__
|
||||
# if CV_VFP
|
||||
ARM_ROUND_DBL(value);
|
||||
# else
|
||||
return (int)lrint(value);
|
||||
# endif
|
||||
#else
|
||||
/* it's ok if round does not comply with IEEE754 standard;
|
||||
the tests should allow +/-1 difference when the tested functions use round */
|
||||
return (int)(value + (value >= 0 ? 0.5 : -0.5));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/** @brief Rounds floating-point number to the nearest integer not larger than the original.
|
||||
|
||||
The function computes an integer i such that:
|
||||
\f[i \le \texttt{value} < i+1\f]
|
||||
@param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the
|
||||
result is not defined.
|
||||
*/
|
||||
CV_INLINE int cvFloor( double value )
|
||||
{
|
||||
#if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
|
||||
__m128d t = _mm_set_sd( value );
|
||||
int i = _mm_cvtsd_si32(t);
|
||||
return i - _mm_movemask_pd(_mm_cmplt_sd(t, _mm_cvtsi32_sd(t,i)));
|
||||
#elif defined __GNUC__
|
||||
int i = (int)value;
|
||||
return i - (i > value);
|
||||
#else
|
||||
int i = cvRound(value);
|
||||
float diff = (float)(value - i);
|
||||
return i - (diff < 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** @brief Rounds floating-point number to the nearest integer not larger than the original.
|
||||
|
||||
The function computes an integer i such that:
|
||||
\f[i \le \texttt{value} < i+1\f]
|
||||
@param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the
|
||||
result is not defined.
|
||||
*/
|
||||
CV_INLINE int cvCeil( double value )
|
||||
{
|
||||
#if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__&& !defined __APPLE__)) && !defined(__CUDACC__)
|
||||
__m128d t = _mm_set_sd( value );
|
||||
int i = _mm_cvtsd_si32(t);
|
||||
return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i), t));
|
||||
#elif defined __GNUC__
|
||||
int i = (int)value;
|
||||
return i + (i < value);
|
||||
#else
|
||||
int i = cvRound(value);
|
||||
float diff = (float)(i - value);
|
||||
return i + (diff < 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** @brief Determines if the argument is Not A Number.
|
||||
|
||||
@param value The input floating-point value
|
||||
|
||||
The function returns 1 if the argument is Not A Number (as defined by IEEE754 standard), 0
|
||||
otherwise. */
|
||||
CV_INLINE int cvIsNaN( double value )
|
||||
{
|
||||
Cv64suf ieee754;
|
||||
ieee754.f = value;
|
||||
return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) +
|
||||
((unsigned)ieee754.u != 0) > 0x7ff00000;
|
||||
}
|
||||
|
||||
/** @brief Determines if the argument is Infinity.
|
||||
|
||||
@param value The input floating-point value
|
||||
|
||||
The function returns 1 if the argument is a plus or minus infinity (as defined by IEEE754 standard)
|
||||
and 0 otherwise. */
|
||||
CV_INLINE int cvIsInf( double value )
|
||||
{
|
||||
Cv64suf ieee754;
|
||||
ieee754.f = value;
|
||||
return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&
|
||||
(unsigned)ieee754.u == 0;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvRound(float value)
|
||||
{
|
||||
#if ((defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__ && \
|
||||
defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
|
||||
__m128 t = _mm_set_ss( value );
|
||||
return _mm_cvtss_si32(t);
|
||||
#elif defined _MSC_VER && defined _M_IX86
|
||||
int t;
|
||||
__asm
|
||||
{
|
||||
fld value;
|
||||
fistp t;
|
||||
}
|
||||
return t;
|
||||
#elif ((defined _MSC_VER && defined _M_ARM) || defined CV_ICC || \
|
||||
defined __GNUC__) && defined HAVE_TEGRA_OPTIMIZATION
|
||||
TEGRA_ROUND_FLT(value);
|
||||
#elif defined CV_ICC || defined __GNUC__
|
||||
# if CV_VFP
|
||||
ARM_ROUND_FLT(value);
|
||||
# else
|
||||
return (int)lrintf(value);
|
||||
# endif
|
||||
#else
|
||||
/* it's ok if round does not comply with IEEE754 standard;
|
||||
the tests should allow +/-1 difference when the tested functions use round */
|
||||
return (int)(value + (value >= 0 ? 0.5f : -0.5f));
|
||||
#endif
|
||||
}
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvRound( int value )
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvFloor( float value )
|
||||
{
|
||||
#if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__ && !defined __APPLE__)) && !defined(__CUDACC__)
|
||||
__m128 t = _mm_set_ss( value );
|
||||
int i = _mm_cvtss_si32(t);
|
||||
return i - _mm_movemask_ps(_mm_cmplt_ss(t, _mm_cvtsi32_ss(t,i)));
|
||||
#elif defined __GNUC__
|
||||
int i = (int)value;
|
||||
return i - (i > value);
|
||||
#else
|
||||
int i = cvRound(value);
|
||||
float diff = (float)(value - i);
|
||||
return i - (diff < 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvFloor( int value )
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvCeil( float value )
|
||||
{
|
||||
#if (defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__&& !defined __APPLE__)) && !defined(__CUDACC__)
|
||||
__m128 t = _mm_set_ss( value );
|
||||
int i = _mm_cvtss_si32(t);
|
||||
return i + _mm_movemask_ps(_mm_cmplt_ss(_mm_cvtsi32_ss(t,i), t));
|
||||
#elif defined __GNUC__
|
||||
int i = (int)value;
|
||||
return i + (i < value);
|
||||
#else
|
||||
int i = cvRound(value);
|
||||
float diff = (float)(i - value);
|
||||
return i + (diff < 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvCeil( int value )
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvIsNaN( float value )
|
||||
{
|
||||
Cv32suf ieee754;
|
||||
ieee754.f = value;
|
||||
return (ieee754.u & 0x7fffffff) > 0x7f800000;
|
||||
}
|
||||
|
||||
/** @overload */
|
||||
CV_INLINE int cvIsInf( float value )
|
||||
{
|
||||
Cv32suf ieee754;
|
||||
ieee754.f = value;
|
||||
return (ieee754.u & 0x7fffffff) == 0x7f800000;
|
||||
}
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
/////////////// saturate_cast (used in image & signal processing) ///////////////////
|
||||
|
||||
/**
|
||||
Template function for accurate conversion from one primitive type to another.
|
||||
|
||||
The functions saturate_cast resemble the standard C++ cast operations, such as static_cast\<T\>()
|
||||
and others. They perform an efficient and accurate conversion from one primitive type to another
|
||||
(see the introduction chapter). saturate in the name means that when the input value v is out of the
|
||||
range of the target type, the result is not formed just by taking low bits of the input, but instead
|
||||
the value is clipped. For example:
|
||||
@code
|
||||
uchar a = saturate_cast<uchar>(-100); // a = 0 (UCHAR_MIN)
|
||||
short b = saturate_cast<short>(33333.33333); // b = 32767 (SHRT_MAX)
|
||||
@endcode
|
||||
Such clipping is done when the target type is unsigned char , signed char , unsigned short or
|
||||
signed short . For 32-bit integers, no clipping is done.
|
||||
|
||||
When the parameter is a floating-point value and the target type is an integer (8-, 16- or 32-bit),
|
||||
the floating-point value is first rounded to the nearest integer and then clipped if needed (when
|
||||
the target type is 8- or 16-bit).
|
||||
|
||||
This operation is used in the simplest or most complex image processing functions in OpenCV.
|
||||
|
||||
@param v Function parameter.
|
||||
@sa add, subtract, multiply, divide, Mat::convertTo
|
||||
*/
|
||||
template<typename _Tp> static inline _Tp saturate_cast(uchar v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(schar v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(ushort v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(short v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(unsigned v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(int v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(float v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(double v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(int64 v) { return _Tp(v); }
|
||||
/** @overload */
|
||||
template<typename _Tp> static inline _Tp saturate_cast(uint64 v) { return _Tp(v); }
|
||||
|
||||
//! @cond IGNORED
|
||||
|
||||
template<> inline uchar saturate_cast<uchar>(schar v) { return (uchar)std::max((int)v, 0); }
|
||||
template<> inline uchar saturate_cast<uchar>(ushort v) { return (uchar)std::min((unsigned)v, (unsigned)UCHAR_MAX); }
|
||||
template<> inline uchar saturate_cast<uchar>(int v) { return (uchar)((unsigned)v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); }
|
||||
template<> inline uchar saturate_cast<uchar>(short v) { return saturate_cast<uchar>((int)v); }
|
||||
template<> inline uchar saturate_cast<uchar>(unsigned v) { return (uchar)std::min(v, (unsigned)UCHAR_MAX); }
|
||||
template<> inline uchar saturate_cast<uchar>(float v) { int iv = cvRound(v); return saturate_cast<uchar>(iv); }
|
||||
template<> inline uchar saturate_cast<uchar>(double v) { int iv = cvRound(v); return saturate_cast<uchar>(iv); }
|
||||
template<> inline uchar saturate_cast<uchar>(int64 v) { return (uchar)((uint64)v <= (uint64)UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); }
|
||||
template<> inline uchar saturate_cast<uchar>(uint64 v) { return (uchar)std::min(v, (uint64)UCHAR_MAX); }
|
||||
|
||||
template<> inline schar saturate_cast<schar>(uchar v) { return (schar)std::min((int)v, SCHAR_MAX); }
|
||||
template<> inline schar saturate_cast<schar>(ushort v) { return (schar)std::min((unsigned)v, (unsigned)SCHAR_MAX); }
|
||||
template<> inline schar saturate_cast<schar>(int v) { return (schar)((unsigned)(v-SCHAR_MIN) <= (unsigned)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); }
|
||||
template<> inline schar saturate_cast<schar>(short v) { return saturate_cast<schar>((int)v); }
|
||||
template<> inline schar saturate_cast<schar>(unsigned v) { return (schar)std::min(v, (unsigned)SCHAR_MAX); }
|
||||
template<> inline schar saturate_cast<schar>(float v) { int iv = cvRound(v); return saturate_cast<schar>(iv); }
|
||||
template<> inline schar saturate_cast<schar>(double v) { int iv = cvRound(v); return saturate_cast<schar>(iv); }
|
||||
template<> inline schar saturate_cast<schar>(int64 v) { return (schar)((uint64)((int64)v-SCHAR_MIN) <= (uint64)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); }
|
||||
template<> inline schar saturate_cast<schar>(uint64 v) { return (schar)std::min(v, (uint64)SCHAR_MAX); }
|
||||
|
||||
template<> inline ushort saturate_cast<ushort>(schar v) { return (ushort)std::max((int)v, 0); }
|
||||
template<> inline ushort saturate_cast<ushort>(short v) { return (ushort)std::max((int)v, 0); }
|
||||
template<> inline ushort saturate_cast<ushort>(int v) { return (ushort)((unsigned)v <= (unsigned)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); }
|
||||
template<> inline ushort saturate_cast<ushort>(unsigned v) { return (ushort)std::min(v, (unsigned)USHRT_MAX); }
|
||||
template<> inline ushort saturate_cast<ushort>(float v) { int iv = cvRound(v); return saturate_cast<ushort>(iv); }
|
||||
template<> inline ushort saturate_cast<ushort>(double v) { int iv = cvRound(v); return saturate_cast<ushort>(iv); }
|
||||
template<> inline ushort saturate_cast<ushort>(int64 v) { return (ushort)((uint64)v <= (uint64)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); }
|
||||
template<> inline ushort saturate_cast<ushort>(uint64 v) { return (ushort)std::min(v, (uint64)USHRT_MAX); }
|
||||
|
||||
template<> inline short saturate_cast<short>(ushort v) { return (short)std::min((int)v, SHRT_MAX); }
|
||||
template<> inline short saturate_cast<short>(int v) { return (short)((unsigned)(v - SHRT_MIN) <= (unsigned)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); }
|
||||
template<> inline short saturate_cast<short>(unsigned v) { return (short)std::min(v, (unsigned)SHRT_MAX); }
|
||||
template<> inline short saturate_cast<short>(float v) { int iv = cvRound(v); return saturate_cast<short>(iv); }
|
||||
template<> inline short saturate_cast<short>(double v) { int iv = cvRound(v); return saturate_cast<short>(iv); }
|
||||
template<> inline short saturate_cast<short>(int64 v) { return (short)((uint64)((int64)v - SHRT_MIN) <= (uint64)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); }
|
||||
template<> inline short saturate_cast<short>(uint64 v) { return (short)std::min(v, (uint64)SHRT_MAX); }
|
||||
|
||||
template<> inline int saturate_cast<int>(float v) { return cvRound(v); }
|
||||
template<> inline int saturate_cast<int>(double v) { return cvRound(v); }
|
||||
|
||||
// we intentionally do not clip negative numbers, to make -1 become 0xffffffff etc.
|
||||
template<> inline unsigned saturate_cast<unsigned>(float v) { return cvRound(v); }
|
||||
template<> inline unsigned saturate_cast<unsigned>(double v) { return cvRound(v); }
|
||||
|
||||
//! @endcond
|
||||
|
||||
}
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
//! @} core_utils
|
||||
|
||||
#endif //__OPENCV_HAL_H__
|
||||
|
292
modules/hal/include/opencv2/hal/intrin.hpp
Normal file
292
modules/hal/include/opencv2/hal/intrin.hpp
Normal file
@ -0,0 +1,292 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
|
||||
// Copyright (C) 2015, Itseez Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_HAL_INTRIN_HPP__
|
||||
#define __OPENCV_HAL_INTRIN_HPP__
|
||||
|
||||
#include <cmath>
|
||||
#include <float.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define OPENCV_HAL_ADD(a, b) ((a) + (b))
|
||||
#define OPENCV_HAL_AND(a, b) ((a) & (b))
|
||||
#define OPENCV_HAL_NOP(a) (a)
|
||||
#define OPENCV_HAL_1ST(a, b) (a)
|
||||
|
||||
// unlike HAL API, which is in cv::hall,
|
||||
// we put intrinsics into cv namespace to make its
|
||||
// access from within opencv code more accessible
|
||||
namespace cv {
|
||||
|
||||
template<typename _Tp> struct V_TypeTraits
|
||||
{
|
||||
typedef _Tp int_type;
|
||||
typedef _Tp uint_type;
|
||||
typedef _Tp abs_type;
|
||||
typedef _Tp sum_type;
|
||||
|
||||
enum { delta = 0, shift = 0 };
|
||||
|
||||
static int_type reinterpret_int(_Tp x) { return x; }
|
||||
static uint_type reinterpet_uint(_Tp x) { return x; }
|
||||
static _Tp reinterpret_from_int(int_type x) { return (_Tp)x; }
|
||||
};
|
||||
|
||||
template<> struct V_TypeTraits<uchar>
|
||||
{
|
||||
typedef uchar value_type;
|
||||
typedef schar int_type;
|
||||
typedef uchar uint_type;
|
||||
typedef uchar abs_type;
|
||||
typedef int sum_type;
|
||||
|
||||
typedef ushort w_type;
|
||||
|
||||
enum { delta = 128, shift = 8 };
|
||||
|
||||
static int_type reinterpret_int(value_type x) { return (int_type)x; }
|
||||
static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
|
||||
static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
|
||||
};
|
||||
|
||||
template<> struct V_TypeTraits<schar>
|
||||
{
|
||||
typedef schar value_type;
|
||||
typedef schar int_type;
|
||||
typedef uchar uint_type;
|
||||
typedef uchar abs_type;
|
||||
typedef int sum_type;
|
||||
|
||||
typedef short w_type;
|
||||
|
||||
enum { delta = 128, shift = 8 };
|
||||
|
||||
static int_type reinterpret_int(value_type x) { return (int_type)x; }
|
||||
static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
|
||||
static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
|
||||
};
|
||||
|
||||
template<> struct V_TypeTraits<ushort>
|
||||
{
|
||||
typedef ushort value_type;
|
||||
typedef short int_type;
|
||||
typedef ushort uint_type;
|
||||
typedef ushort abs_type;
|
||||
typedef int sum_type;
|
||||
|
||||
typedef unsigned w_type;
|
||||
typedef uchar nu_type;
|
||||
|
||||
enum { delta = 32768, shift = 16 };
|
||||
|
||||
static int_type reinterpret_int(value_type x) { return (int_type)x; }
|
||||
static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
|
||||
static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
|
||||
};
|
||||
|
||||
template<> struct V_TypeTraits<short>
|
||||
{
|
||||
typedef short value_type;
|
||||
typedef short int_type;
|
||||
typedef ushort uint_type;
|
||||
typedef ushort abs_type;
|
||||
typedef int sum_type;
|
||||
|
||||
typedef int w_type;
|
||||
typedef uchar nu_type;
|
||||
typedef schar n_type;
|
||||
|
||||
enum { delta = 128, shift = 8 };
|
||||
|
||||
static int_type reinterpret_int(value_type x) { return (int_type)x; }
|
||||
static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
|
||||
static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
|
||||
};
|
||||
|
||||
template<> struct V_TypeTraits<unsigned>
|
||||
{
|
||||
typedef unsigned value_type;
|
||||
typedef int int_type;
|
||||
typedef unsigned uint_type;
|
||||
typedef unsigned abs_type;
|
||||
typedef unsigned sum_type;
|
||||
|
||||
typedef uint64 w_type;
|
||||
typedef ushort nu_type;
|
||||
|
||||
static int_type reinterpret_int(value_type x) { return (int_type)x; }
|
||||
static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
|
||||
static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
|
||||
};
|
||||
|
||||
template<> struct V_TypeTraits<int>
|
||||
{
|
||||
typedef int value_type;
|
||||
typedef int int_type;
|
||||
typedef unsigned uint_type;
|
||||
typedef unsigned abs_type;
|
||||
typedef int sum_type;
|
||||
|
||||
typedef int64 w_type;
|
||||
typedef short n_type;
|
||||
typedef ushort nu_type;
|
||||
|
||||
static int_type reinterpret_int(value_type x) { return (int_type)x; }
|
||||
static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
|
||||
static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
|
||||
};
|
||||
|
||||
template<> struct V_TypeTraits<uint64>
|
||||
{
|
||||
typedef uint64 value_type;
|
||||
typedef int64 int_type;
|
||||
typedef uint64 uint_type;
|
||||
typedef uint64 abs_type;
|
||||
typedef uint64 sum_type;
|
||||
|
||||
typedef unsigned nu_type;
|
||||
|
||||
static int_type reinterpret_int(value_type x) { return (int_type)x; }
|
||||
static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
|
||||
static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
|
||||
};
|
||||
|
||||
template<> struct V_TypeTraits<int64>
|
||||
{
|
||||
typedef int64 value_type;
|
||||
typedef int64 int_type;
|
||||
typedef uint64 uint_type;
|
||||
typedef uint64 abs_type;
|
||||
typedef int64 sum_type;
|
||||
|
||||
typedef int nu_type;
|
||||
|
||||
static int_type reinterpret_int(value_type x) { return (int_type)x; }
|
||||
static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
|
||||
static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
|
||||
};
|
||||
|
||||
|
||||
template<> struct V_TypeTraits<float>
|
||||
{
|
||||
typedef float value_type;
|
||||
typedef int int_type;
|
||||
typedef unsigned uint_type;
|
||||
typedef float abs_type;
|
||||
typedef float sum_type;
|
||||
|
||||
typedef double w_type;
|
||||
|
||||
static int_type reinterpret_int(value_type x)
|
||||
{
|
||||
Cv32suf u;
|
||||
u.f = x;
|
||||
return u.i;
|
||||
}
|
||||
static uint_type reinterpet_uint(value_type x)
|
||||
{
|
||||
Cv32suf u;
|
||||
u.f = x;
|
||||
return u.u;
|
||||
}
|
||||
static value_type reinterpret_from_int(int_type x)
|
||||
{
|
||||
Cv32suf u;
|
||||
u.i = x;
|
||||
return u.f;
|
||||
}
|
||||
};
|
||||
|
||||
template<> struct V_TypeTraits<double>
|
||||
{
|
||||
typedef double value_type;
|
||||
typedef int64 int_type;
|
||||
typedef uint64 uint_type;
|
||||
typedef double abs_type;
|
||||
typedef double sum_type;
|
||||
static int_type reinterpret_int(value_type x)
|
||||
{
|
||||
Cv64suf u;
|
||||
u.f = x;
|
||||
return u.i;
|
||||
}
|
||||
static uint_type reinterpet_uint(value_type x)
|
||||
{
|
||||
Cv64suf u;
|
||||
u.f = x;
|
||||
return u.u;
|
||||
}
|
||||
static value_type reinterpret_from_int(int_type x)
|
||||
{
|
||||
Cv64suf u;
|
||||
u.i = x;
|
||||
return u.f;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#if CV_SSE2
|
||||
|
||||
#include "opencv2/hal/intrin_sse.hpp"
|
||||
|
||||
#elif CV_NEON
|
||||
|
||||
#include "opencv2/hal/intrin_neon.hpp"
|
||||
|
||||
#else
|
||||
|
||||
#include "opencv2/hal/intrin_cpp.hpp"
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef CV_SIMD128
|
||||
#define CV_SIMD128 0
|
||||
#endif
|
||||
|
||||
#ifndef CV_SIMD128_64F
|
||||
#define CV_SIMD128_64F 0
|
||||
#endif
|
||||
|
||||
#endif
|
811
modules/hal/include/opencv2/hal/intrin_cpp.hpp
Normal file
811
modules/hal/include/opencv2/hal/intrin_cpp.hpp
Normal file
@ -0,0 +1,811 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
|
||||
// Copyright (C) 2015, Itseez Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_HAL_INTRIN_CPP_HPP__
|
||||
#define __OPENCV_HAL_INTRIN_CPP_HPP__
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
template<typename _Tp, int n> struct v_reg
|
||||
{
|
||||
typedef _Tp lane_type;
|
||||
typedef v_reg<typename V_TypeTraits<_Tp>::int_type, n> int_vec;
|
||||
typedef v_reg<typename V_TypeTraits<_Tp>::abs_type, n> abs_vec;
|
||||
enum { nlanes = n };
|
||||
|
||||
explicit v_reg(const _Tp* ptr) { for( int i = 0; i < n; i++ ) s[i] = ptr[i]; }
|
||||
v_reg(_Tp s0, _Tp s1) { s[0] = s0; s[1] = s1; }
|
||||
v_reg(_Tp s0, _Tp s1, _Tp s2, _Tp s3) { s[0] = s0; s[1] = s1; s[2] = s2; s[3] = s3; }
|
||||
v_reg(_Tp s0, _Tp s1, _Tp s2, _Tp s3,
|
||||
_Tp s4, _Tp s5, _Tp s6, _Tp s7)
|
||||
{
|
||||
s[0] = s0; s[1] = s1; s[2] = s2; s[3] = s3;
|
||||
s[4] = s4; s[5] = s5; s[6] = s6; s[7] = s7;
|
||||
}
|
||||
v_reg(_Tp s0, _Tp s1, _Tp s2, _Tp s3,
|
||||
_Tp s4, _Tp s5, _Tp s6, _Tp s7,
|
||||
_Tp s8, _Tp s9, _Tp s10, _Tp s11,
|
||||
_Tp s12, _Tp s13, _Tp s14, _Tp s15)
|
||||
{
|
||||
s[0] = s0; s[1] = s1; s[2] = s2; s[3] = s3;
|
||||
s[4] = s4; s[5] = s5; s[6] = s6; s[7] = s7;
|
||||
s[8] = s8; s[9] = s9; s[10] = s10; s[11] = s11;
|
||||
s[12] = s12; s[13] = s13; s[14] = s14; s[15] = s15;
|
||||
}
|
||||
|
||||
v_reg() {}
|
||||
v_reg(const v_reg<_Tp, n> & r)
|
||||
{
|
||||
for( int i = 0; i < n; i++ )
|
||||
s[i] = r.s[i];
|
||||
}
|
||||
|
||||
_Tp get(const int i) const { return s[i]; }
|
||||
_Tp get0() const { return s[0]; }
|
||||
v_reg<_Tp, n> high() const
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
int i;
|
||||
for( i = 0; i < n/2; i++ )
|
||||
{
|
||||
c.s[i] = s[i+(n/2)];
|
||||
c.s[i+(n/2)] = 0;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
static v_reg<_Tp, n> zero()
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = (_Tp)0;
|
||||
return c;
|
||||
}
|
||||
|
||||
static v_reg<_Tp, n> all(_Tp s)
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = s;
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp2, int n2> v_reg<_Tp2, n2> reinterpret_as() const
|
||||
{
|
||||
size_t bytes = std::min(sizeof(_Tp2)*n2, sizeof(_Tp)*n);
|
||||
v_reg<_Tp2, n2> c;
|
||||
memcpy(&c.s[0], &s[0], bytes);
|
||||
return c;
|
||||
}
|
||||
|
||||
_Tp s[n];
|
||||
};
|
||||
|
||||
#define OPENCV_HAL_IMPL_BIN_OP(bin_op) \
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n> \
|
||||
operator bin_op (const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \
|
||||
{ \
|
||||
v_reg<_Tp, n> c; \
|
||||
for( int i = 0; i < n; i++ ) \
|
||||
c.s[i] = saturate_cast<_Tp>(a.s[i] bin_op b.s[i]); \
|
||||
return c; \
|
||||
} \
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n>& \
|
||||
operator bin_op##= (v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \
|
||||
{ \
|
||||
for( int i = 0; i < n; i++ ) \
|
||||
a.s[i] = saturate_cast<_Tp>(a.s[i] bin_op b.s[i]); \
|
||||
return a; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_BIN_OP(+)
|
||||
OPENCV_HAL_IMPL_BIN_OP(-)
|
||||
OPENCV_HAL_IMPL_BIN_OP(*)
|
||||
OPENCV_HAL_IMPL_BIN_OP(/)
|
||||
|
||||
#define OPENCV_HAL_IMPL_BIT_OP(bit_op) \
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n> operator bit_op \
|
||||
(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \
|
||||
{ \
|
||||
v_reg<_Tp, n> c; \
|
||||
typedef typename V_TypeTraits<_Tp>::int_type itype; \
|
||||
for( int i = 0; i < n; i++ ) \
|
||||
c.s[i] = V_TypeTraits<_Tp>::reinterpret_from_int((itype)(V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) bit_op \
|
||||
V_TypeTraits<_Tp>::reinterpret_int(b.s[i]))); \
|
||||
return c; \
|
||||
} \
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n>& operator \
|
||||
bit_op##= (v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \
|
||||
{ \
|
||||
typedef typename V_TypeTraits<_Tp>::int_type itype; \
|
||||
for( int i = 0; i < n; i++ ) \
|
||||
a.s[i] = V_TypeTraits<_Tp>::reinterpret_from_int((itype)(V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) bit_op \
|
||||
V_TypeTraits<_Tp>::reinterpret_int(b.s[i]))); \
|
||||
return a; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_BIT_OP(&)
|
||||
OPENCV_HAL_IMPL_BIT_OP(|)
|
||||
OPENCV_HAL_IMPL_BIT_OP(^)
|
||||
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n> operator ~ (const v_reg<_Tp, n>& a)
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = V_TypeTraits<_Tp>::reinterpret_from_int(~V_TypeTraits<_Tp>::reinterpret_int(a.s[i]));
|
||||
return c;
|
||||
}
|
||||
|
||||
#define OPENCV_HAL_IMPL_MATH_FUNC(func, cfunc, _Tp2) \
|
||||
template<typename _Tp, int n> inline v_reg<_Tp2, n> func(const v_reg<_Tp, n>& a) \
|
||||
{ \
|
||||
v_reg<_Tp2, n> c; \
|
||||
for( int i = 0; i < n; i++ ) \
|
||||
c.s[i] = cfunc(a.s[i]); \
|
||||
return c; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_sqrt, std::sqrt, _Tp)
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_sin, std::sin, _Tp)
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_cos, std::cos, _Tp)
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_exp, std::exp, _Tp)
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_log, std::log, _Tp)
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_abs, (typename V_TypeTraits<_Tp>::abs_type)std::abs,
|
||||
typename V_TypeTraits<_Tp>::abs_type)
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_round, cvRound, int)
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_floor, cvFloor, int)
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_ceil, cvCeil, int)
|
||||
OPENCV_HAL_IMPL_MATH_FUNC(v_trunc, int, int)
|
||||
|
||||
#define OPENCV_HAL_IMPL_MINMAX_FUNC(func, hfunc, cfunc) \
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n> func(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \
|
||||
{ \
|
||||
v_reg<_Tp, n> c; \
|
||||
for( int i = 0; i < n; i++ ) \
|
||||
c.s[i] = cfunc(a.s[i], b.s[i]); \
|
||||
return c; \
|
||||
} \
|
||||
template<typename _Tp, int n> inline _Tp hfunc(const v_reg<_Tp, n>& a) \
|
||||
{ \
|
||||
_Tp c = a.s[0]; \
|
||||
for( int i = 1; i < n; i++ ) \
|
||||
c = cfunc(c, a.s[i]); \
|
||||
return c; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_MINMAX_FUNC(v_min, v_reduce_min, std::min)
|
||||
OPENCV_HAL_IMPL_MINMAX_FUNC(v_max, v_reduce_max, std::max)
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline void v_minmax( const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b,
|
||||
v_reg<_Tp, n>& minval, v_reg<_Tp, n>& maxval )
|
||||
{
|
||||
for( int i = 0; i < n; i++ )
|
||||
{
|
||||
minval.s[i] = std::min(a.s[i], b.s[i]);
|
||||
maxval.s[i] = std::max(a.s[i], b.s[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define OPENCV_HAL_IMPL_CMP_OP(cmp_op) \
|
||||
template<typename _Tp, int n> \
|
||||
inline v_reg<_Tp, n> operator cmp_op(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \
|
||||
{ \
|
||||
typedef typename V_TypeTraits<_Tp>::int_type itype; \
|
||||
v_reg<_Tp, n> c; \
|
||||
for( int i = 0; i < n; i++ ) \
|
||||
c.s[i] = V_TypeTraits<_Tp>::reinterpret_from_int((itype)-(int)(a.s[i] cmp_op b.s[i])); \
|
||||
return c; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_CMP_OP(<)
|
||||
OPENCV_HAL_IMPL_CMP_OP(>)
|
||||
OPENCV_HAL_IMPL_CMP_OP(<=)
|
||||
OPENCV_HAL_IMPL_CMP_OP(>=)
|
||||
OPENCV_HAL_IMPL_CMP_OP(==)
|
||||
OPENCV_HAL_IMPL_CMP_OP(!=)
|
||||
|
||||
#define OPENCV_HAL_IMPL_ADD_SUB_OP(func, bin_op, cast_op, _Tp2) \
|
||||
template<typename _Tp, int n> \
|
||||
inline v_reg<_Tp2, n> func(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \
|
||||
{ \
|
||||
typedef _Tp2 rtype; \
|
||||
v_reg<rtype, n> c; \
|
||||
for( int i = 0; i < n; i++ ) \
|
||||
c.s[i] = cast_op(a.s[i] bin_op b.s[i]); \
|
||||
return c; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_ADD_SUB_OP(v_add_wrap, +, (_Tp), _Tp)
|
||||
OPENCV_HAL_IMPL_ADD_SUB_OP(v_sub_wrap, -, (_Tp), _Tp)
|
||||
OPENCV_HAL_IMPL_ADD_SUB_OP(v_absdiff, -, (rtype)std::abs, typename V_TypeTraits<_Tp>::abs_type)
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline v_reg<_Tp, n> v_invsqrt(const v_reg<_Tp, n>& a)
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = 1.f/std::sqrt(a.s[i]);
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline v_reg<_Tp, n> v_magnitude(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b)
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = std::sqrt(a.s[i]*a.s[i] + b.s[i]*b.s[i]);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline v_reg<_Tp, n> v_sqr_magnitude(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b)
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = a.s[i]*a.s[i] + b.s[i]*b.s[i];
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline v_reg<_Tp, n> v_muladd(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b,
|
||||
const v_reg<_Tp, n>& c)
|
||||
{
|
||||
v_reg<_Tp, n> d;
|
||||
for( int i = 0; i < n; i++ )
|
||||
d.s[i] = a.s[i]*b.s[i] + c.s[i];
|
||||
return d;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline v_reg<typename V_TypeTraits<_Tp>::w_type, n/2>
|
||||
v_dotprod(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b)
|
||||
{
|
||||
typedef typename V_TypeTraits<_Tp>::w_type w_type;
|
||||
v_reg<w_type, n/2> c;
|
||||
for( int i = 0; i < (n/2); i++ )
|
||||
c.s[i] = (w_type)a.s[i*2]*b.s[i*2] + (w_type)a.s[i*2+1]*b.s[i*2+1];
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline void v_mul_expand(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b,
|
||||
v_reg<typename V_TypeTraits<_Tp>::w_type, n/2>& c,
|
||||
v_reg<typename V_TypeTraits<_Tp>::w_type, n/2>& d)
|
||||
{
|
||||
typedef typename V_TypeTraits<_Tp>::w_type w_type;
|
||||
for( int i = 0; i < (n/2); i++ )
|
||||
{
|
||||
c.s[i] = (w_type)a.s[i]*b.s[i]*2;
|
||||
d.s[i] = (w_type)a.s[i+(n/2)]*b.s[i+(n/2)];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline void v_hsum(const v_reg<_Tp, n>& a,
|
||||
v_reg<typename V_TypeTraits<_Tp>::w_type, n/2>& c)
|
||||
{
|
||||
typedef typename V_TypeTraits<_Tp>::w_type w_type;
|
||||
for( int i = 0; i < (n/2); i++ )
|
||||
{
|
||||
c.s[i] = (w_type)a.s[i*2] + a.s[i*2+1];
|
||||
}
|
||||
}
|
||||
|
||||
#define OPENCV_HAL_IMPL_SHIFT_OP(shift_op) \
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n> operator shift_op(const v_reg<_Tp, n>& a, int imm) \
|
||||
{ \
|
||||
v_reg<_Tp, n> c; \
|
||||
for( int i = 0; i < n; i++ ) \
|
||||
c.s[i] = (_Tp)(a.s[i] shift_op imm); \
|
||||
return c; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_SHIFT_OP(<<)
|
||||
OPENCV_HAL_IMPL_SHIFT_OP(>>)
|
||||
|
||||
template<typename _Tp, int n> inline typename V_TypeTraits<_Tp>::sum_type v_reduce_sum(const v_reg<_Tp, n>& a)
|
||||
{
|
||||
typename V_TypeTraits<_Tp>::sum_type c = a.s[0];
|
||||
for( int i = 1; i < n; i++ )
|
||||
c += a.s[i];
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline int v_signmask(const v_reg<_Tp, n>& a)
|
||||
{
|
||||
int mask = 0;
|
||||
for( int i = 0; i < n; i++ )
|
||||
mask |= (V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) < 0) << i;
|
||||
return mask;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline bool v_check_all(const v_reg<_Tp, n>& a)
|
||||
{
|
||||
for( int i = 0; i < n; i++ )
|
||||
if( V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) >= 0 )
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline bool v_check_any(const v_reg<_Tp, n>& a)
|
||||
{
|
||||
for( int i = 0; i < n; i++ )
|
||||
if( V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) < 0 )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n> v_select(const v_reg<_Tp, n>& mask,
|
||||
const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b)
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = V_TypeTraits<_Tp>::reinterpret_int(mask.s[i]) < 0 ? b.s[i] : a.s[i];
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline void v_expand(const v_reg<_Tp, n>& a,
|
||||
v_reg<typename V_TypeTraits<_Tp>::w_type, n/2>& b0,
|
||||
v_reg<typename V_TypeTraits<_Tp>::w_type, n/2>& b1)
|
||||
{
|
||||
for( int i = 0; i < (n/2); i++ )
|
||||
{
|
||||
b0.s[i] = a.s[i];
|
||||
b1.s[i] = a.s[i+(n/2)];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline v_reg<typename V_TypeTraits<_Tp>::int_type, n>
|
||||
v_reinterpret_as_int(const v_reg<_Tp, n>& a)
|
||||
{
|
||||
v_reg<typename V_TypeTraits<_Tp>::int_type, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = V_TypeTraits<_Tp>::reinterpret_int(a.s[i]);
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline v_reg<typename V_TypeTraits<_Tp>::uint_type, n>
|
||||
v_reinterpret_as_uint(const v_reg<_Tp, n>& a)
|
||||
{
|
||||
v_reg<typename V_TypeTraits<_Tp>::uint_type, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = V_TypeTraits<_Tp>::reinterpret_uint(a.s[i]);
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline void v_zip( const v_reg<_Tp, n>& a0, const v_reg<_Tp, n>& a1,
|
||||
v_reg<_Tp, n>& b0, v_reg<_Tp, n>& b1 )
|
||||
{
|
||||
int i;
|
||||
for( i = 0; i < n/2; i++ )
|
||||
{
|
||||
b0.s[i*2] = a0.s[i];
|
||||
b0.s[i*2+1] = a1.s[i];
|
||||
}
|
||||
for( ; i < n; i++ )
|
||||
{
|
||||
b1.s[i*2-n] = a0.s[i];
|
||||
b1.s[i*2-n+1] = a1.s[i];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n> v_load(const _Tp* ptr)
|
||||
{
|
||||
return v_reg<_Tp, n>(ptr);
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline v_reg<_Tp, n> v_load_aligned(const _Tp* ptr)
|
||||
{
|
||||
return v_reg<_Tp, n>(ptr);
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline void v_load_halves(const _Tp* loptr, const _Tp* hiptr)
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < n/2; i++ )
|
||||
{
|
||||
c.s[i] = loptr[i];
|
||||
c.s[i+n/2] = hiptr[i];
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline v_reg<typename V_TypeTraits<_Tp>::w_type, n> v_load_expand(const _Tp* ptr)
|
||||
{
|
||||
typedef typename V_TypeTraits<_Tp>::w_type w_type;
|
||||
v_reg<w_type, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
{
|
||||
c.s[i] = ptr[i];
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline v_reg<typename
|
||||
V_TypeTraits<typename V_TypeTraits<_Tp>::w_type>::w_type, n> v_load_expand_q(const _Tp* ptr)
|
||||
{
|
||||
typedef typename V_TypeTraits<typename V_TypeTraits<_Tp>::w_type>::w_type w_type;
|
||||
v_reg<w_type, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
{
|
||||
c.s[i] = ptr[i];
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline void v_load_deinterleave(const _Tp* ptr, v_reg<_Tp, n>& a,
|
||||
v_reg<_Tp, n>& b, v_reg<_Tp, n>& c)
|
||||
{
|
||||
int i, i3;
|
||||
for( i = i3 = 0; i < n; i++, i3 += 3 )
|
||||
{
|
||||
a.s[i] = ptr[i3];
|
||||
b.s[i] = ptr[i3+1];
|
||||
c.s[i] = ptr[i3+2];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline void v_load_deinterleave(const _Tp* ptr, v_reg<_Tp, n>& a,
|
||||
v_reg<_Tp, n>& b, v_reg<_Tp, n>& c,
|
||||
v_reg<_Tp, n>& d)
|
||||
{
|
||||
int i, i4;
|
||||
for( i = i4 = 0; i < n; i++, i4 += 4 )
|
||||
{
|
||||
a.s[i] = ptr[i4];
|
||||
b.s[i] = ptr[i4+1];
|
||||
c.s[i] = ptr[i4+2];
|
||||
d.s[i] = ptr[i4+3];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline void v_store_interleave( _Tp* ptr, const v_reg<_Tp, n>& a,
|
||||
const v_reg<_Tp, n>& b, const v_reg<_Tp, n>& c)
|
||||
{
|
||||
int i, i3;
|
||||
for( i = i3 = 0; i < n; i++, i3 += 3 )
|
||||
{
|
||||
ptr[i3] = a.s[i];
|
||||
ptr[i3+1] = b.s[i];
|
||||
ptr[i3+2] = c.s[i];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, int n> inline void v_store_interleave( _Tp* ptr, const v_reg<_Tp, n>& a,
|
||||
const v_reg<_Tp, n>& b, const v_reg<_Tp, n>& c,
|
||||
const v_reg<_Tp, n>& d)
|
||||
{
|
||||
int i, i4;
|
||||
for( i = i4 = 0; i < n; i++, i4 += 4 )
|
||||
{
|
||||
ptr[i4] = a.s[i];
|
||||
ptr[i4+1] = b.s[i];
|
||||
ptr[i4+2] = c.s[i];
|
||||
ptr[i4+3] = d.s[i];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline void v_store(_Tp* ptr, const v_reg<_Tp, n>& a)
|
||||
{
|
||||
for( int i = 0; i < n; i++ )
|
||||
ptr[i] = a.s[i];
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline void v_store_low(_Tp* ptr, const v_reg<_Tp, n>& a)
|
||||
{
|
||||
for( int i = 0; i < (n/2); i++ )
|
||||
ptr[i] = a.s[i];
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline void v_store_high(_Tp* ptr, const v_reg<_Tp, n>& a)
|
||||
{
|
||||
for( int i = 0; i < (n/2); i++ )
|
||||
ptr[i] = a.s[i+(n/2)];
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline void v_store_aligned(_Tp* ptr, const v_reg<_Tp, n>& a)
|
||||
{
|
||||
for( int i = 0; i < n; i++ )
|
||||
ptr[i] = a.s[i];
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline v_reg<_Tp, n> v_combine_low(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b)
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < (n/2); i++ )
|
||||
{
|
||||
c.s[i] = a.s[i];
|
||||
c.s[i+(n/2)] = b.s[i];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline v_reg<_Tp, n> v_combine_high(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b)
|
||||
{
|
||||
v_reg<_Tp, n> c;
|
||||
for( int i = 0; i < (n/2); i++ )
|
||||
{
|
||||
c.s[i] = a.s[i+(n/2)];
|
||||
c.s[i+(n/2)] = b.s[i+(n/2)];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _Tp, int n>
|
||||
inline void v_recombine(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b,
|
||||
v_reg<_Tp, n>& low, v_reg<_Tp, n>& high)
|
||||
{
|
||||
for( int i = 0; i < (n/2); i++ )
|
||||
{
|
||||
low.s[i] = a.s[i];
|
||||
low.s[i+(n/2)] = b.s[i];
|
||||
high.s[i] = a.s[i+(n/2)];
|
||||
high.s[i+(n/2)] = b.s[i+(n/2)];
|
||||
}
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<int, n> v_round(const v_reg<float, n>& a)
|
||||
{
|
||||
v_reg<int, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = cvRound(a.s[i]);
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<int, n> v_floor(const v_reg<float, n>& a)
|
||||
{
|
||||
v_reg<int, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = cvFloor(a.s[i]);
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<int, n> v_ceil(const v_reg<float, n>& a)
|
||||
{
|
||||
v_reg<int, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = cvCeil(a.s[i]);
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<int, n> v_trunc(const v_reg<float, n>& a)
|
||||
{
|
||||
v_reg<int, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = (int)(a.s[i]);
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<int, n*2> v_round(const v_reg<double, n>& a)
|
||||
{
|
||||
v_reg<int, n*2> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
{
|
||||
c.s[i] = cvRound(a.s[i]);
|
||||
c.s[i+n] = 0;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<int, n*2> v_floor(const v_reg<double, n>& a)
|
||||
{
|
||||
v_reg<int, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
{
|
||||
c.s[i] = cvFloor(a.s[i]);
|
||||
c.s[i+n] = 0;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<int, n*2> v_ceil(const v_reg<double, n>& a)
|
||||
{
|
||||
v_reg<int, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
{
|
||||
c.s[i] = cvCeil(a.s[i]);
|
||||
c.s[i+n] = 0;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<int, n*2> v_trunc(const v_reg<double, n>& a)
|
||||
{
|
||||
v_reg<int, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
{
|
||||
c.s[i] = cvCeil(a.s[i]);
|
||||
c.s[i+n] = 0;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<float, n> v_cvt_f32(const v_reg<int, n>& a)
|
||||
{
|
||||
v_reg<float, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = (float)a.s[i];
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<double, n> v_cvt_f64(const v_reg<int, n*2>& a)
|
||||
{
|
||||
v_reg<double, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = (double)a.s[i];
|
||||
return c;
|
||||
}
|
||||
|
||||
template<int n> inline v_reg<double, n> v_cvt_f64(const v_reg<float, n*2>& a)
|
||||
{
|
||||
v_reg<double, n> c;
|
||||
for( int i = 0; i < n; i++ )
|
||||
c.s[i] = (double)a.s[i];
|
||||
return c;
|
||||
}
|
||||
|
||||
template<typename _Tp>
|
||||
inline void v_transpose4x4( v_reg<_Tp, 4>& a0, const v_reg<_Tp, 4>& a1,
|
||||
const v_reg<_Tp, 4>& a2, const v_reg<_Tp, 4>& a3,
|
||||
v_reg<_Tp, 4>& b0, v_reg<_Tp, 4>& b1,
|
||||
v_reg<_Tp, 4>& b2, v_reg<_Tp, 4>& b3 )
|
||||
{
|
||||
b0 = v_reg<_Tp, 4>(a0.s[0], a1.s[0], a2.s[0], a3.s[0]);
|
||||
b1 = v_reg<_Tp, 4>(a0.s[1], a1.s[1], a2.s[1], a3.s[1]);
|
||||
b2 = v_reg<_Tp, 4>(a0.s[2], a1.s[2], a2.s[2], a3.s[2]);
|
||||
b3 = v_reg<_Tp, 4>(a0.s[3], a1.s[3], a2.s[3], a3.s[3]);
|
||||
}
|
||||
|
||||
typedef v_reg<uchar, 16> v_uint8x16;
|
||||
typedef v_reg<schar, 16> v_int8x16;
|
||||
typedef v_reg<ushort, 8> v_uint16x8;
|
||||
typedef v_reg<short, 8> v_int16x8;
|
||||
typedef v_reg<unsigned, 4> v_uint32x4;
|
||||
typedef v_reg<int, 4> v_int32x4;
|
||||
typedef v_reg<float, 4> v_float32x4;
|
||||
typedef v_reg<float, 8> v_float32x8;
|
||||
typedef v_reg<double, 2> v_float64x2;
|
||||
typedef v_reg<uint64, 2> v_uint64x2;
|
||||
typedef v_reg<int64, 2> v_int64x2;
|
||||
|
||||
#define OPENCV_HAL_IMPL_C_INIT(_Tpvec, _Tp, suffix) \
|
||||
inline _Tpvec v_setzero_##suffix() { return _Tpvec::zero(); } \
|
||||
inline _Tpvec v_setall_##suffix(_Tp val) { return _Tpvec::all(val); } \
|
||||
template<typename _Tp0, int n0> inline _Tpvec \
|
||||
v_reinterpret_as_##suffix(const v_reg<_Tp0, n0>& a) \
|
||||
{ return a.template reinterpret_as<_Tp, _Tpvec::nlanes>(a); }
|
||||
|
||||
OPENCV_HAL_IMPL_C_INIT(v_uint8x16, uchar, u8)
|
||||
OPENCV_HAL_IMPL_C_INIT(v_int8x16, schar, s8)
|
||||
OPENCV_HAL_IMPL_C_INIT(v_uint16x8, ushort, u16)
|
||||
OPENCV_HAL_IMPL_C_INIT(v_int16x8, short, s16)
|
||||
OPENCV_HAL_IMPL_C_INIT(v_uint32x4, unsigned, u32)
|
||||
OPENCV_HAL_IMPL_C_INIT(v_int32x4, int, s32)
|
||||
OPENCV_HAL_IMPL_C_INIT(v_float32x4, float, f32)
|
||||
OPENCV_HAL_IMPL_C_INIT(v_float64x2, double, f64)
|
||||
OPENCV_HAL_IMPL_C_INIT(v_uint64x2, uint64, u64)
|
||||
OPENCV_HAL_IMPL_C_INIT(v_uint64x2, int64, s64)
|
||||
|
||||
#define OPENCV_HAL_IMPL_C_SHIFT(_Tpvec, _Tp) \
|
||||
template<int n> inline _Tpvec v_shl(const _Tpvec& a) \
|
||||
{ return a << n; } \
|
||||
template<int n> inline _Tpvec v_shr(const _Tpvec& a) \
|
||||
{ return a >> n; } \
|
||||
template<int n> inline _Tpvec v_rshr(const _Tpvec& a) \
|
||||
{ \
|
||||
_Tpvec c; \
|
||||
for( int i = 0; i < _Tpvec::nlanes; i++ ) \
|
||||
c.s[i] = (_Tp)((a.s[i] + ((_Tp)1 << (n - 1))) >> n); \
|
||||
return c; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_C_SHIFT(v_uint16x8, ushort)
|
||||
OPENCV_HAL_IMPL_C_SHIFT(v_int16x8, short)
|
||||
OPENCV_HAL_IMPL_C_SHIFT(v_uint32x4, unsigned)
|
||||
OPENCV_HAL_IMPL_C_SHIFT(v_int32x4, int)
|
||||
OPENCV_HAL_IMPL_C_SHIFT(v_uint64x2, uint64)
|
||||
OPENCV_HAL_IMPL_C_SHIFT(v_int64x2, int64)
|
||||
|
||||
|
||||
#define OPENCV_HAL_IMPL_C_PACK(_Tpvec, _Tp, _Tpnvec, _Tpn, pack_suffix) \
|
||||
inline _Tpnvec v_##pack_suffix(const _Tpvec& a, const _Tpvec& b) \
|
||||
{ \
|
||||
_Tpnvec c; \
|
||||
for( int i = 0; i < _Tpvec::nlanes; i++ ) \
|
||||
{ \
|
||||
c.s[i] = saturate_cast<_Tpn>(a.s[i]); \
|
||||
c.s[i+_Tpvec::nlanes] = saturate_cast<_Tpn>(b.s[i]); \
|
||||
} \
|
||||
return c; \
|
||||
} \
|
||||
template<int n> inline _Tpnvec v_rshr_##pack_suffix(const _Tpvec& a, const _Tpvec& b) \
|
||||
{ \
|
||||
_Tpnvec c; \
|
||||
for( int i = 0; i < _Tpvec::nlanes; i++ ) \
|
||||
{ \
|
||||
c.s[i] = saturate_cast<_Tpn>((a.s[i] + ((_Tp)1 << (n - 1))) >> n); \
|
||||
c.s[i+_Tpvec::nlanes] = saturate_cast<_Tpn>((b.s[i] + ((_Tp)1 << (n - 1))) >> n); \
|
||||
} \
|
||||
return c; \
|
||||
} \
|
||||
inline void v_##pack_suffix##_store(_Tpn* ptr, const _Tpvec& a) \
|
||||
{ \
|
||||
for( int i = 0; i < _Tpvec::nlanes; i++ ) \
|
||||
ptr[i] = saturate_cast<_Tpn>(a.s[i]); \
|
||||
} \
|
||||
template<int n> inline void v_rshr_##pack_suffix##_store(_Tpn* ptr, const _Tpvec& a) \
|
||||
{ \
|
||||
for( int i = 0; i < _Tpvec::nlanes; i++ ) \
|
||||
ptr[i] = saturate_cast<_Tpn>((a.s[i] + ((_Tp)1 << (n - 1))) >> n); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_C_PACK(v_uint16x8, ushort, v_uint8x16, uchar, pack)
|
||||
OPENCV_HAL_IMPL_C_PACK(v_int16x8, short, v_int8x16, schar, pack)
|
||||
OPENCV_HAL_IMPL_C_PACK(v_int16x8, short, v_uint8x16, uchar, pack_u)
|
||||
OPENCV_HAL_IMPL_C_PACK(v_uint32x4, unsigned, v_uint16x8, ushort, pack)
|
||||
OPENCV_HAL_IMPL_C_PACK(v_int32x4, int, v_int16x8, short, pack)
|
||||
OPENCV_HAL_IMPL_C_PACK(v_int32x4, int, v_uint16x8, ushort, pack_u)
|
||||
OPENCV_HAL_IMPL_C_PACK(v_uint64x2, uint64, v_uint32x4, unsigned, pack)
|
||||
OPENCV_HAL_IMPL_C_PACK(v_int64x2, int64, v_int32x4, int, pack)
|
||||
|
||||
inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0,
|
||||
const v_float32x4& m1, const v_float32x4& m2,
|
||||
const v_float32x4& m3)
|
||||
{
|
||||
return v_float32x4(v.s[0]*m0.s[0] + v.s[1]*m1.s[0] + v.s[2]*m2.s[0] + v.s[3]*m3.s[0],
|
||||
v.s[0]*m0.s[1] + v.s[1]*m1.s[1] + v.s[2]*m2.s[1] + v.s[3]*m3.s[1],
|
||||
v.s[0]*m0.s[2] + v.s[1]*m1.s[2] + v.s[2]*m2.s[2] + v.s[3]*m3.s[2],
|
||||
v.s[0]*m0.s[3] + v.s[1]*m1.s[3] + v.s[2]*m2.s[3] + v.s[3]*m3.s[3]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
823
modules/hal/include/opencv2/hal/intrin_neon.hpp
Normal file
823
modules/hal/include/opencv2/hal/intrin_neon.hpp
Normal file
@ -0,0 +1,823 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
|
||||
// Copyright (C) 2015, Itseez Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_HAL_INTRIN_NEON_HPP__
|
||||
#define __OPENCV_HAL_INTRIN_NEON_HPP__
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
#define CV_SIMD128 1
|
||||
|
||||
struct v_uint8x16
|
||||
{
|
||||
typedef uchar lane_type;
|
||||
enum { nlanes = 16 };
|
||||
|
||||
v_uint8x16() {}
|
||||
explicit v_uint8x16(uint8x16_t v) : val(v) {}
|
||||
v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7,
|
||||
uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15)
|
||||
{
|
||||
uchar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15};
|
||||
val = vld1q_u8(v);
|
||||
}
|
||||
uchar get0() const
|
||||
{
|
||||
return vgetq_lane_u8(val, 0);
|
||||
}
|
||||
|
||||
uint8x16_t val;
|
||||
};
|
||||
|
||||
struct v_int8x16
|
||||
{
|
||||
typedef schar lane_type;
|
||||
enum { nlanes = 16 };
|
||||
|
||||
v_int8x16() {}
|
||||
explicit v_int8x16(int8x16_t v) : val(v) {}
|
||||
v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7,
|
||||
schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15)
|
||||
{
|
||||
schar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15};
|
||||
val = vld1q_s8(v);
|
||||
}
|
||||
schar get0() const
|
||||
{
|
||||
return vgetq_lane_s8(val, 0);
|
||||
}
|
||||
|
||||
int8x16_t val;
|
||||
};
|
||||
|
||||
struct v_uint16x8
|
||||
{
|
||||
typedef ushort lane_type;
|
||||
enum { nlanes = 8 };
|
||||
|
||||
v_uint16x8() {}
|
||||
explicit v_uint16x8(uint16x8_t v) : val(v) {}
|
||||
v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7)
|
||||
{
|
||||
ushort v[] = {v0, v1, v2, v3, v4, v5, v6, v7};
|
||||
val = vld1q_u16(v);
|
||||
}
|
||||
ushort get0() const
|
||||
{
|
||||
return vgetq_lane_u16(val, 0);
|
||||
}
|
||||
|
||||
uint16x8_t val;
|
||||
};
|
||||
|
||||
struct v_int16x8
|
||||
{
|
||||
typedef short lane_type;
|
||||
enum { nlanes = 8 };
|
||||
|
||||
v_int16x8() {}
|
||||
explicit v_int16x8(int16x8_t v) : val(v) {}
|
||||
v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7)
|
||||
{
|
||||
short v[] = {v0, v1, v2, v3, v4, v5, v6, v7};
|
||||
val = vld1q_s16(v);
|
||||
}
|
||||
short get0() const
|
||||
{
|
||||
return vgetq_lane_s16(val, 0);
|
||||
}
|
||||
|
||||
int16x8_t val;
|
||||
};
|
||||
|
||||
struct v_uint32x4
|
||||
{
|
||||
typedef unsigned lane_type;
|
||||
enum { nlanes = 4 };
|
||||
|
||||
v_uint32x4() {}
|
||||
explicit v_uint32x4(uint32x4_t v) : val(v) {}
|
||||
v_uint32x4(unsigned v0, unsigned v1, unsigned v2, unsigned v3)
|
||||
{
|
||||
unsigned v[] = {v0, v1, v2, v3};
|
||||
val = vld1q_u32(v);
|
||||
}
|
||||
unsigned get0() const
|
||||
{
|
||||
return vgetq_lane_u32(val, 0);
|
||||
}
|
||||
|
||||
uint32x4_t val;
|
||||
};
|
||||
|
||||
struct v_int32x4
|
||||
{
|
||||
typedef int lane_type;
|
||||
enum { nlanes = 4 };
|
||||
|
||||
v_int32x4() {}
|
||||
explicit v_int32x4(int32x4_t v) : val(v) {}
|
||||
v_int32x4(int v0, int v1, int v2, int v3)
|
||||
{
|
||||
int v[] = {v0, v1, v2, v3};
|
||||
val = vld1q_s32(v);
|
||||
}
|
||||
int get0() const
|
||||
{
|
||||
return vgetq_lane_s32(val, 0);
|
||||
}
|
||||
int32x4_t val;
|
||||
};
|
||||
|
||||
struct v_float32x4
|
||||
{
|
||||
typedef float lane_type;
|
||||
enum { nlanes = 4 };
|
||||
|
||||
v_float32x4() {}
|
||||
explicit v_float32x4(float32x4_t v) : val(v) {}
|
||||
v_float32x4(float v0, float v1, float v2, float v3)
|
||||
{
|
||||
float v[] = {v0, v1, v2, v3};
|
||||
val = vld1q_f32(v);
|
||||
}
|
||||
float get0() const
|
||||
{
|
||||
return vgetq_lane_f32(val, 0);
|
||||
}
|
||||
float32x4_t val;
|
||||
};
|
||||
|
||||
struct v_uint64x2
|
||||
{
|
||||
typedef uint64 lane_type;
|
||||
enum { nlanes = 2 };
|
||||
|
||||
v_uint64x2() {}
|
||||
explicit v_uint64x2(uint64x2_t v) : val(v) {}
|
||||
v_uint64x2(unsigned v0, unsigned v1)
|
||||
{
|
||||
uint64 v[] = {v0, v1};
|
||||
val = vld1q_u64(v);
|
||||
}
|
||||
uint64 get0() const
|
||||
{
|
||||
return vgetq_lane_u64(val, 0);
|
||||
}
|
||||
uint64x2_t val;
|
||||
};
|
||||
|
||||
struct v_int64x2
|
||||
{
|
||||
typedef int64 lane_type;
|
||||
enum { nlanes = 2 };
|
||||
|
||||
v_int64x2() {}
|
||||
explicit v_int64x2(int64x2_t v) : val(v) {}
|
||||
v_int64x2(int v0, int v1)
|
||||
{
|
||||
int64 v[] = {v0, v1};
|
||||
val = vld1q_s64(v);
|
||||
}
|
||||
int64 get0() const
|
||||
{
|
||||
return vgetq_lane_s64(val, 0);
|
||||
}
|
||||
int64x2_t val;
|
||||
};
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_INIT(_Tpv, _Tp, suffix) \
|
||||
inline v_##_Tpv v_setzero_##suffix() { return v_##_Tpv(vdupq_n_##suffix((_Tp)0)); } \
|
||||
inline v_##_Tpv v_setall_##suffix(_Tp v) { return v_##_Tpv(vdupq_n_##suffix(v)); } \
|
||||
inline _Tpv##_t vreinterpretq_##suffix##_##suffix(_Tpv##_t v) { return v; } \
|
||||
inline v_uint8x16 v_reinterpret_as_u8(const v_##_Tpv& v) { return v_uint8x16(vreinterpretq_u8_##suffix(v.val)); } \
|
||||
inline v_int8x16 v_reinterpret_as_s8(const v_##_Tpv& v) { return v_int8x16(vreinterpretq_s8_##suffix(v.val)); } \
|
||||
inline v_uint16x8 v_reinterpret_as_u16(const v_##_Tpv& v) { return v_uint16x8(vreinterpretq_u16_##suffix(v.val)); } \
|
||||
inline v_int16x8 v_reinterpret_as_s16(const v_##_Tpv& v) { return v_int16x8(vreinterpretq_s16_##suffix(v.val)); } \
|
||||
inline v_uint32x4 v_reinterpret_as_u32(const v_##_Tpv& v) { return v_uint32x4(vreinterpretq_u32_##suffix(v.val)); } \
|
||||
inline v_int32x4 v_reinterpret_as_s32(const v_##_Tpv& v) { return v_int32x4(vreinterpretq_s32_##suffix(v.val)); } \
|
||||
inline v_uint64x2 v_reinterpret_as_u64(const v_##_Tpv& v) { return v_uint64x2(vreinterpretq_u64_##suffix(v.val)); } \
|
||||
inline v_int64x2 v_reinterpret_as_s64(const v_##_Tpv& v) { return v_int64x2(vreinterpretq_s64_##suffix(v.val)); } \
|
||||
inline v_float32x4 v_reinterpret_as_f32(const v_##_Tpv& v) { return v_float32x4(vreinterpretq_f32_##suffix(v.val)); }
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_INIT(uint8x16, uchar, u8)
|
||||
OPENCV_HAL_IMPL_NEON_INIT(int8x16, schar, s8)
|
||||
OPENCV_HAL_IMPL_NEON_INIT(uint16x8, ushort, u16)
|
||||
OPENCV_HAL_IMPL_NEON_INIT(int16x8, short, s16)
|
||||
OPENCV_HAL_IMPL_NEON_INIT(uint32x4, unsigned, u32)
|
||||
OPENCV_HAL_IMPL_NEON_INIT(int32x4, int, s32)
|
||||
OPENCV_HAL_IMPL_NEON_INIT(uint64x2, uint64, u64)
|
||||
OPENCV_HAL_IMPL_NEON_INIT(int64x2, int64, s64)
|
||||
OPENCV_HAL_IMPL_NEON_INIT(float32x4, float, f32)
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_PACK(_Tpvec, _Tp, hreg, suffix, _Tpwvec, wsuffix, pack, op) \
|
||||
inline _Tpvec v_##pack(const _Tpwvec& a, const _Tpwvec& b) \
|
||||
{ \
|
||||
hreg a1 = vqmov##op##_##wsuffix(a.val), b1 = vqmov##op##_##wsuffix(b.val); \
|
||||
return _Tpvec(vcombine_##suffix(a1, b1)); \
|
||||
} \
|
||||
inline void v_##pack##_store(_Tp* ptr, const _Tpwvec& a) \
|
||||
{ \
|
||||
hreg a1 = vqmov##op##_##wsuffix(a.val); \
|
||||
vst1_##suffix(ptr, a1); \
|
||||
} \
|
||||
template<int n> inline \
|
||||
_Tpvec v_rshr_##pack(const _Tpwvec& a, const _Tpwvec& b) \
|
||||
{ \
|
||||
hreg a1 = vqrshr##op##_n_##wsuffix(a.val, n); \
|
||||
hreg b1 = vqrshr##op##_n_##wsuffix(b.val, n); \
|
||||
return _Tpvec(vcombine_##suffix(a1, b1)); \
|
||||
} \
|
||||
template<int n> inline \
|
||||
void v_rshr_##pack##_store(_Tp* ptr, const _Tpwvec& a) \
|
||||
{ \
|
||||
hreg a1 = vqrshr##op##_n_##wsuffix(a.val, n); \
|
||||
vst1_##suffix(ptr, a1); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_PACK(v_uint8x16, uchar, uint8x8_t, u8, v_uint16x8, u16, pack, n)
|
||||
OPENCV_HAL_IMPL_NEON_PACK(v_uint8x16, uchar, uint8x8_t, u8, v_int16x8, s16, pack_u, un)
|
||||
OPENCV_HAL_IMPL_NEON_PACK(v_int8x16, schar, int8x8_t, s8, v_int16x8, s16, pack, n)
|
||||
OPENCV_HAL_IMPL_NEON_PACK(v_uint16x8, ushort, uint16x4_t, u16, v_uint32x4, u32, pack, n)
|
||||
OPENCV_HAL_IMPL_NEON_PACK(v_uint16x8, ushort, uint16x4_t, u16, v_int32x4, s32, pack_u, un)
|
||||
OPENCV_HAL_IMPL_NEON_PACK(v_int16x8, short, int16x4_t, s16, v_int32x4, s32, pack, n)
|
||||
OPENCV_HAL_IMPL_NEON_PACK(v_uint32x4, unsigned, uint32x2_t, u32, v_uint64x2, u64, pack, n)
|
||||
OPENCV_HAL_IMPL_NEON_PACK(v_int32x4, int, int32x2_t, s32, v_int64x2, s64, pack, n)
|
||||
|
||||
inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0,
|
||||
const v_float32x4& m1, const v_float32x4& m2,
|
||||
const v_float32x4& m3)
|
||||
{
|
||||
float32x2_t vl = vget_low_f32(v.val), vh = vget_high_f32(v.val);
|
||||
float32x4_t res = vmulq_lane_f32(m0.val, vl, 0);
|
||||
res = vmlaq_lane_f32(res, m1.val, vl, 1);
|
||||
res = vmlaq_lane_f32(res, m2.val, vh, 0);
|
||||
res = vmlaq_lane_f32(res, m3.val, vh, 1);
|
||||
return v_float32x4(res);
|
||||
}
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_BIN_OP(bin_op, _Tpvec, intrin) \
|
||||
inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \
|
||||
{ \
|
||||
return _Tpvec(intrin(a.val, b.val)); \
|
||||
} \
|
||||
inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \
|
||||
{ \
|
||||
a.val = intrin(a.val, b.val); \
|
||||
return a; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(+, v_uint8x16, vqaddq_u8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(-, v_uint8x16, vqsubq_u8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(+, v_int8x16, vqaddq_s8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(-, v_int8x16, vqsubq_s8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(+, v_uint16x8, vqaddq_u16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(-, v_uint16x8, vqsubq_u16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(*, v_uint16x8, vmulq_u16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(+, v_int16x8, vqaddq_s16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(-, v_int16x8, vqsubq_s16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(*, v_int16x8, vmulq_s16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(+, v_int32x4, vaddq_s32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(-, v_int32x4, vsubq_s32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(*, v_int32x4, vmulq_s32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(+, v_float32x4, vaddq_f32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(-, v_float32x4, vsubq_f32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(*, v_float32x4, vmulq_f32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(+, v_int64x2, vaddq_s64)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(-, v_int64x2, vsubq_s64)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(+, v_uint64x2, vaddq_u64)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(-, v_uint64x2, vsubq_u64)
|
||||
|
||||
inline v_float32x4 operator / (const v_float32x4& a, const v_float32x4& b)
|
||||
{
|
||||
float32x4_t reciprocal = vrecpeq_f32(b.val);
|
||||
reciprocal = vmulq_f32(vrecpsq_f32(b.val, reciprocal), reciprocal);
|
||||
reciprocal = vmulq_f32(vrecpsq_f32(b.val, reciprocal), reciprocal);
|
||||
return v_float32x4(vmulq_f32(a.val, reciprocal));
|
||||
}
|
||||
inline v_float32x4& operator /= (v_float32x4& a, const v_float32x4& b)
|
||||
{
|
||||
float32x4_t reciprocal = vrecpeq_f32(b.val);
|
||||
reciprocal = vmulq_f32(vrecpsq_f32(b.val, reciprocal), reciprocal);
|
||||
reciprocal = vmulq_f32(vrecpsq_f32(b.val, reciprocal), reciprocal);
|
||||
a.val = vmulq_f32(a.val, reciprocal);
|
||||
return a;
|
||||
}
|
||||
|
||||
inline void v_mul_expand(const v_int16x8& a, const v_int16x8& b,
|
||||
v_int32x4& c, v_int32x4& d)
|
||||
{
|
||||
c.val = vmull_s16(vget_low_s16(a.val), vget_low_s16(b.val));
|
||||
d.val = vmull_s16(vget_high_s16(a.val), vget_high_s16(b.val));
|
||||
}
|
||||
|
||||
inline void v_mul_expand(const v_uint16x8& a, const v_uint16x8& b,
|
||||
v_uint32x4& c, v_uint32x4& d)
|
||||
{
|
||||
c.val = vmull_u16(vget_low_u16(a.val), vget_low_u16(b.val));
|
||||
d.val = vmull_u16(vget_high_u16(a.val), vget_high_u16(b.val));
|
||||
}
|
||||
|
||||
inline void v_mul_expand(const v_uint32x4& a, const v_uint32x4& b,
|
||||
v_uint64x2& c, v_uint64x2& d)
|
||||
{
|
||||
c.val = vmull_u32(vget_low_u32(a.val), vget_low_u32(b.val));
|
||||
d.val = vmull_u32(vget_high_u32(a.val), vget_high_u32(b.val));
|
||||
}
|
||||
|
||||
inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b)
|
||||
{
|
||||
int32x4_t c = vmull_s16(vget_low_s16(a.val), vget_low_s16(b.val));
|
||||
int32x4_t d = vmull_s16(vget_high_s16(a.val), vget_high_s16(b.val));
|
||||
int32x4x2_t cd = vtrnq_s32(c, d);
|
||||
return v_int32x4(vaddq_s32(cd.val[0], cd.val[1]));
|
||||
}
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_LOGIC_OP(_Tpvec, suffix) \
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(&, _Tpvec, vandq_##suffix) \
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(|, _Tpvec, vorrq_##suffix) \
|
||||
OPENCV_HAL_IMPL_NEON_BIN_OP(^, _Tpvec, veorq_##suffix) \
|
||||
inline _Tpvec operator ~ (const _Tpvec& a) \
|
||||
{ \
|
||||
return _Tpvec(vreinterpretq_##suffix##_u8(vmvnq_u8(vreinterpretq_u8_##suffix(a.val)))); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_uint8x16, u8)
|
||||
OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_int8x16, s8)
|
||||
OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_uint16x8, u16)
|
||||
OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_int16x8, s16)
|
||||
OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_uint32x4, u32)
|
||||
OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_int32x4, s32)
|
||||
OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_uint64x2, u64)
|
||||
OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_int64x2, s64)
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_FLT_BIT_OP(bin_op, intrin) \
|
||||
inline v_float32x4 operator bin_op (const v_float32x4& a, const v_float32x4& b) \
|
||||
{ \
|
||||
return v_float32x4(vreinterpretq_f32_s32(intrin(vreinterpretq_s32_f32(a.val), vreinterpretq_s32_f32(b.val)))); \
|
||||
} \
|
||||
inline v_float32x4& operator bin_op##= (v_float32x4& a, const v_float32x4& b) \
|
||||
{ \
|
||||
a.val = vreinterpretq_f32_s32(intrin(vreinterpretq_s32_f32(a.val), vreinterpretq_s32_f32(b.val))); \
|
||||
return a; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_FLT_BIT_OP(&, vandq_s32)
|
||||
OPENCV_HAL_IMPL_NEON_FLT_BIT_OP(|, vorrq_s32)
|
||||
OPENCV_HAL_IMPL_NEON_FLT_BIT_OP(^, veorq_s32)
|
||||
|
||||
inline v_float32x4 operator ~ (const v_float32x4& a)
|
||||
{
|
||||
return v_float32x4(vreinterpretq_f32_s32(vmvnq_s32(vreinterpretq_s32_f32(a.val))));
|
||||
}
|
||||
|
||||
inline v_float32x4 v_sqrt(const v_float32x4& x)
|
||||
{
|
||||
float32x4_t x1 = vmaxq_f32(x.val, vdupq_n_f32(FLT_MIN));
|
||||
float32x4_t e = vrsqrteq_f32(x1);
|
||||
e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e);
|
||||
e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e);
|
||||
return v_float32x4(vmulq_f32(x.val, e));
|
||||
}
|
||||
|
||||
inline v_float32x4 v_invsqrt(const v_float32x4& x)
|
||||
{
|
||||
float32x4_t e = vrsqrteq_f32(x.val);
|
||||
e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x.val, e), e), e);
|
||||
e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x.val, e), e), e);
|
||||
return v_float32x4(e);
|
||||
}
|
||||
|
||||
inline v_float32x4 v_abs(v_float32x4 x)
|
||||
{ return v_float32x4(vabsq_f32(x.val)); }
|
||||
|
||||
// TODO: exp, log, sin, cos
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_BIN_FUNC(_Tpvec, func, intrin) \
|
||||
inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \
|
||||
{ \
|
||||
return _Tpvec(intrin(a.val, b.val)); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_min, vminq_u8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_max, vmaxq_u8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int8x16, v_min, vminq_s8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int8x16, v_max, vmaxq_s8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_min, vminq_u16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_max, vmaxq_u16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int16x8, v_min, vminq_s16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int16x8, v_max, vmaxq_s16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint32x4, v_min, vminq_u32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint32x4, v_max, vmaxq_u32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int32x4, v_min, vminq_s32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int32x4, v_max, vmaxq_s32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_float32x4, v_min, vminq_f32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_float32x4, v_max, vmaxq_f32)
|
||||
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_INT_CMP_OP(_Tpvec, cast, suffix, not_suffix) \
|
||||
inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \
|
||||
{ return _Tpvec(cast(vceqq_##suffix(a.val, b.val))); } \
|
||||
inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \
|
||||
{ return _Tpvec(cast(vmvnq_##not_suffix(vceqq_##suffix(a.val, b.val)))); } \
|
||||
inline _Tpvec operator < (const _Tpvec& a, const _Tpvec& b) \
|
||||
{ return _Tpvec(cast(vcltq_##suffix(a.val, b.val))); } \
|
||||
inline _Tpvec operator > (const _Tpvec& a, const _Tpvec& b) \
|
||||
{ return _Tpvec(cast(vcgtq_##suffix(a.val, b.val))); } \
|
||||
inline _Tpvec operator <= (const _Tpvec& a, const _Tpvec& b) \
|
||||
{ return _Tpvec(cast(vcleq_##suffix(a.val, b.val))); } \
|
||||
inline _Tpvec operator >= (const _Tpvec& a, const _Tpvec& b) \
|
||||
{ return _Tpvec(cast(vcgeq_##suffix(a.val, b.val))); }
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_uint8x16, OPENCV_HAL_NOP, u8, u8)
|
||||
OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_int8x16, vreinterpretq_s8_u8, s8, u8)
|
||||
OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_uint16x8, OPENCV_HAL_NOP, u16, u16)
|
||||
OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_int16x8, vreinterpretq_s16_u16, s16, u16)
|
||||
OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_uint32x4, OPENCV_HAL_NOP, u32, u32)
|
||||
OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_int32x4, vreinterpretq_s32_u32, s32, u32)
|
||||
OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_float32x4, vreinterpretq_f32_u32, f32, u32)
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_add_wrap, vaddq_u8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int8x16, v_add_wrap, vaddq_s8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_add_wrap, vaddq_u16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int16x8, v_add_wrap, vaddq_s16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_sub_wrap, vsubq_u8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int8x16, v_sub_wrap, vsubq_s8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_sub_wrap, vsubq_u16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int16x8, v_sub_wrap, vsubq_s16)
|
||||
|
||||
// TODO: absdiff for signed integers
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_absdiff, vabdq_u8)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_absdiff, vabdq_u16)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint32x4, v_absdiff, vabdq_u32)
|
||||
OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_float32x4, v_absdiff, vabdq_f32)
|
||||
|
||||
inline v_float32x4 v_magnitude(const v_float32x4& a, const v_float32x4& b)
|
||||
{
|
||||
v_float32x4 x(vmlaq_f32(vmulq_f32(a.val, a.val), b.val, b.val));
|
||||
return v_sqrt(x);
|
||||
}
|
||||
|
||||
inline v_float32x4 v_sqr_magnitude(const v_float32x4& a, const v_float32x4& b)
|
||||
{
|
||||
return v_float32x4(vmlaq_f32(vmulq_f32(a.val, a.val), b.val, b.val));
|
||||
}
|
||||
|
||||
inline v_float32x4 v_muladd(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c)
|
||||
{
|
||||
return v_float32x4(vmlaq_f32(c.val, a.val, b.val));
|
||||
}
|
||||
|
||||
// trade efficiency for convenience
|
||||
#define OPENCV_HAL_IMPL_NEON_SHIFT_OP(_Tpvec, suffix, _Tps, ssuffix) \
|
||||
inline _Tpvec operator << (const _Tpvec& a, int n) \
|
||||
{ return _Tpvec(vshlq_##suffix(a.val, vdupq_n_##ssuffix((_Tps)n))); } \
|
||||
inline _Tpvec operator >> (const _Tpvec& a, int n) \
|
||||
{ return _Tpvec(vshlq_##suffix(a.val, vdupq_n_##ssuffix((_Tps)-n))); } \
|
||||
template<int n> inline _Tpvec v_shl(const _Tpvec& a) \
|
||||
{ return _Tpvec(vshlq_n_##suffix(a.val, n)); } \
|
||||
template<int n> inline _Tpvec v_shr(const _Tpvec& a) \
|
||||
{ return _Tpvec(vshrq_n_##suffix(a.val, n)); } \
|
||||
template<int n> inline _Tpvec v_rshr(const _Tpvec& a) \
|
||||
{ return _Tpvec(vrshrq_n_##suffix(a.val, n)); }
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_uint8x16, u8, schar, s8)
|
||||
OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_int8x16, s8, schar, s8)
|
||||
OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_uint16x8, u16, short, s16)
|
||||
OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_int16x8, s16, short, s16)
|
||||
OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_uint32x4, u32, int, s32)
|
||||
OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_int32x4, s32, int, s32)
|
||||
OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_uint64x2, u64, int64, s64)
|
||||
OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_int64x2, s64, int64, s64)
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(_Tpvec, _Tp, suffix) \
|
||||
inline _Tpvec v_load(const _Tp* ptr) \
|
||||
{ return _Tpvec(vld1q_##suffix(ptr)); } \
|
||||
inline _Tpvec v_load_aligned(const _Tp* ptr) \
|
||||
{ return _Tpvec(vld1q_##suffix(ptr)); } \
|
||||
inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \
|
||||
{ return _Tpvec(vcombine_##suffix(vld1_##suffix(ptr0), vld1_##suffix(ptr1))); } \
|
||||
inline void v_store(_Tp* ptr, const _Tpvec& a) \
|
||||
{ vst1q_##suffix(ptr, a.val); } \
|
||||
inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \
|
||||
{ vst1q_##suffix(ptr, a.val); } \
|
||||
inline void v_store_low(_Tp* ptr, const _Tpvec& a) \
|
||||
{ vst1_##suffix(ptr, vget_low_##suffix(a.val)); } \
|
||||
inline void v_store_high(_Tp* ptr, const _Tpvec& a) \
|
||||
{ vst1_##suffix(ptr, vget_high_##suffix(a.val)); }
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_uint8x16, uchar, u8)
|
||||
OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_int8x16, schar, s8)
|
||||
OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_uint16x8, ushort, u16)
|
||||
OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_int16x8, short, s16)
|
||||
OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_uint32x4, unsigned, u32)
|
||||
OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_int32x4, int, s32)
|
||||
OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_float32x4, float, f32)
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(_Tpvec, scalartype, func, scalar_func) \
|
||||
inline scalartype v_reduce_##func(const _Tpvec& a) \
|
||||
{ \
|
||||
scalartype CV_DECL_ALIGNED(16) buf[4]; \
|
||||
v_store_aligned(buf, a); \
|
||||
scalartype s0 = scalar_func(buf[0], buf[1]); \
|
||||
scalartype s1 = scalar_func(buf[2], buf[3]); \
|
||||
return scalar_func(s0, s1); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_uint32x4, unsigned, sum, OPENCV_HAL_ADD)
|
||||
OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_uint32x4, unsigned, max, std::max)
|
||||
OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_uint32x4, unsigned, min, std::min)
|
||||
OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_int32x4, int, sum, OPENCV_HAL_ADD)
|
||||
OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_int32x4, int, max, std::max)
|
||||
OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_int32x4, int, min, std::min)
|
||||
OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_float32x4, float, sum, OPENCV_HAL_ADD)
|
||||
OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_float32x4, float, max, std::max)
|
||||
OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_float32x4, float, min, std::min)
|
||||
|
||||
inline int v_signmask(const v_uint8x16& a)
|
||||
{
|
||||
int8x8_t m0 = vcreate_s8(CV_BIG_UINT(0x0706050403020100));
|
||||
uint8x16_t v0 = vshlq_u8(vshrq_n_u8(a.val, 7), vcombine_s8(m0, m0));
|
||||
uint64x2_t v1 = vpaddlq_u32(vpaddlq_u16(vpaddlq_u8(v0)));
|
||||
return (int)vgetq_lane_u64(v1, 0) + ((int)vgetq_lane_u64(v1, 1) << 8);
|
||||
}
|
||||
inline int v_signmask(const v_int8x16& a)
|
||||
{ return v_signmask(v_reinterpret_as_u8(a)); }
|
||||
|
||||
inline int v_signmask(const v_uint16x8& a)
|
||||
{
|
||||
int16x4_t m0 = vcreate_s16(CV_BIG_UINT(0x0003000200010000));
|
||||
uint16x8_t v0 = vshlq_u16(vshrq_n_u16(a.val, 15), vcombine_s16(m0, m0));
|
||||
uint64x2_t v1 = vpaddlq_u32(vpaddlq_u16(v0));
|
||||
return (int)vgetq_lane_u64(v1, 0) + ((int)vgetq_lane_u64(v1, 1) << 4);
|
||||
}
|
||||
inline int v_signmask(const v_int16x8& a)
|
||||
{ return v_signmask(v_reinterpret_as_u16(a)); }
|
||||
|
||||
inline int v_signmask(const v_uint32x4& a)
|
||||
{
|
||||
int32x2_t m0 = vcreate_s32(CV_BIG_UINT(0x0000000100000000));
|
||||
uint32x4_t v0 = vshlq_u32(vshrq_n_u32(a.val, 31), vcombine_s32(m0, m0));
|
||||
uint64x2_t v1 = vpaddlq_u32(v0);
|
||||
return (int)vgetq_lane_u64(v1, 0) + ((int)vgetq_lane_u64(v1, 1) << 2);
|
||||
}
|
||||
inline int v_signmask(const v_int32x4& a)
|
||||
{ return v_signmask(v_reinterpret_as_u32(a)); }
|
||||
inline int v_signmask(const v_float32x4& a)
|
||||
{ return v_signmask(v_reinterpret_as_u32(a)); }
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_CHECK_ALLANY(_Tpvec, suffix, shift) \
|
||||
inline bool v_check_all(const v_##_Tpvec& a) \
|
||||
{ \
|
||||
_Tpvec##_t v0 = vshrq_n_##suffix(vmvnq_##suffix(a.val), shift); \
|
||||
uint64x2_t v1 = vreinterpretq_u64_##suffix(v0); \
|
||||
return (vgetq_lane_u64(v1, 0) | vgetq_lane_u64(v1, 1)) == 0; \
|
||||
} \
|
||||
inline bool v_check_any(const v_##_Tpvec& a) \
|
||||
{ \
|
||||
_Tpvec##_t v0 = vshrq_n_##suffix(a.val, shift); \
|
||||
uint64x2_t v1 = vreinterpretq_u64_##suffix(v0); \
|
||||
return (vgetq_lane_u64(v1, 0) | vgetq_lane_u64(v1, 1)) != 0; \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_CHECK_ALLANY(uint8x16, u8, 7)
|
||||
OPENCV_HAL_IMPL_NEON_CHECK_ALLANY(uint16x8, u16, 15)
|
||||
OPENCV_HAL_IMPL_NEON_CHECK_ALLANY(uint32x4, u32, 31)
|
||||
|
||||
inline bool v_check_all(const v_int8x16& a)
|
||||
{ return v_check_all(v_reinterpret_as_u8(a)); }
|
||||
inline bool v_check_all(const v_int16x8& a)
|
||||
{ return v_check_all(v_reinterpret_as_u16(a)); }
|
||||
inline bool v_check_all(const v_int32x4& a)
|
||||
{ return v_check_all(v_reinterpret_as_u32(a)); }
|
||||
inline bool v_check_all(const v_float32x4& a)
|
||||
{ return v_check_all(v_reinterpret_as_u32(a)); }
|
||||
|
||||
inline bool v_check_any(const v_int8x16& a)
|
||||
{ return v_check_all(v_reinterpret_as_u8(a)); }
|
||||
inline bool v_check_any(const v_int16x8& a)
|
||||
{ return v_check_all(v_reinterpret_as_u16(a)); }
|
||||
inline bool v_check_any(const v_int32x4& a)
|
||||
{ return v_check_all(v_reinterpret_as_u32(a)); }
|
||||
inline bool v_check_any(const v_float32x4& a)
|
||||
{ return v_check_all(v_reinterpret_as_u32(a)); }
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_SELECT(_Tpvec, suffix, usuffix) \
|
||||
inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \
|
||||
{ \
|
||||
return _Tpvec(vbslq_##suffix(vreinterpretq_##usuffix##_##suffix(mask.val), a.val, b.val)); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_SELECT(v_uint8x16, u8, u8)
|
||||
OPENCV_HAL_IMPL_NEON_SELECT(v_int8x16, s8, u8)
|
||||
OPENCV_HAL_IMPL_NEON_SELECT(v_uint16x8, u16, u16)
|
||||
OPENCV_HAL_IMPL_NEON_SELECT(v_int16x8, s16, u16)
|
||||
OPENCV_HAL_IMPL_NEON_SELECT(v_uint32x4, u32, u32)
|
||||
OPENCV_HAL_IMPL_NEON_SELECT(v_int32x4, s32, u32)
|
||||
OPENCV_HAL_IMPL_NEON_SELECT(v_float32x4, f32, u32)
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_EXPAND(_Tpvec, _Tpwvec, _Tp, suffix) \
|
||||
inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \
|
||||
{ \
|
||||
b0.val = vmovl_##suffix(vget_low_##suffix(a.val)); \
|
||||
b1.val = vmovl_##suffix(vget_high_##suffix(a.val)); \
|
||||
} \
|
||||
inline _Tpwvec v_load_expand(const _Tp* ptr) \
|
||||
{ \
|
||||
return _Tpwvec(vmovl_##suffix(vld1_##suffix(ptr))); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_EXPAND(v_uint8x16, v_uint16x8, uchar, u8)
|
||||
OPENCV_HAL_IMPL_NEON_EXPAND(v_int8x16, v_int16x8, schar, s8)
|
||||
OPENCV_HAL_IMPL_NEON_EXPAND(v_uint16x8, v_uint32x4, ushort, u16)
|
||||
OPENCV_HAL_IMPL_NEON_EXPAND(v_int16x8, v_int32x4, short, s16)
|
||||
|
||||
inline v_uint32x4 v_load_expand_q(const uchar* ptr)
|
||||
{
|
||||
uint8x8_t v0 = vcreate_u8(*(unsigned*)ptr);
|
||||
uint16x4_t v1 = vget_low_u16(vmovl_u8(v0));
|
||||
return v_uint32x4(vmovl_u16(v1));
|
||||
}
|
||||
|
||||
inline v_int32x4 v_load_expand_q(const schar* ptr)
|
||||
{
|
||||
int8x8_t v0 = vcreate_s8(*(unsigned*)ptr);
|
||||
int16x4_t v1 = vget_low_s16(vmovl_s8(v0));
|
||||
return v_int32x4(vmovl_s16(v1));
|
||||
}
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_UNPACKS(_Tpvec, suffix) \
|
||||
inline void v_zip(const v_##_Tpvec& a0, const v_##_Tpvec& a1, v_##_Tpvec& b0, v_##_Tpvec& b1) \
|
||||
{ \
|
||||
_Tpvec##x2_t p = vzipq_##suffix(a0.val, a1.val); \
|
||||
b0.val = p.val[0]; \
|
||||
b1.val = p.val[1]; \
|
||||
} \
|
||||
inline v_##_Tpvec v_combine_low(const v_##_Tpvec& a, const v_##_Tpvec& b) \
|
||||
{ \
|
||||
return v_##_Tpvec(vcombine_##suffix(vget_low_##suffix(a.val), vget_low_##suffix(b.val))); \
|
||||
} \
|
||||
inline v_##_Tpvec v_combine_high(const v_##_Tpvec& a, const v_##_Tpvec& b) \
|
||||
{ \
|
||||
return v_##_Tpvec(vcombine_##suffix(vget_high_##suffix(a.val), vget_high_##suffix(b.val))); \
|
||||
} \
|
||||
inline void v_recombine(const v_##_Tpvec& a, const v_##_Tpvec& b, v_##_Tpvec& c, v_##_Tpvec& d) \
|
||||
{ \
|
||||
c.val = vcombine_##suffix(vget_low_##suffix(a.val), vget_low_##suffix(b.val)); \
|
||||
d.val = vcombine_##suffix(vget_high_##suffix(a.val), vget_high_##suffix(b.val)); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_UNPACKS(uint8x16, u8)
|
||||
OPENCV_HAL_IMPL_NEON_UNPACKS(int8x16, s8)
|
||||
OPENCV_HAL_IMPL_NEON_UNPACKS(uint16x8, u16)
|
||||
OPENCV_HAL_IMPL_NEON_UNPACKS(int16x8, s16)
|
||||
OPENCV_HAL_IMPL_NEON_UNPACKS(uint32x4, u32)
|
||||
OPENCV_HAL_IMPL_NEON_UNPACKS(int32x4, s32)
|
||||
OPENCV_HAL_IMPL_NEON_UNPACKS(float32x4, f32)
|
||||
|
||||
inline v_int32x4 v_round(const v_float32x4& a)
|
||||
{
|
||||
static const int32x4_t v_sign = vdupq_n_s32(1 << 31),
|
||||
v_05 = vreinterpretq_s32_f32(vdupq_n_f32(0.5f));
|
||||
|
||||
int32x4_t v_addition = vorrq_s32(v_05, vandq_s32(v_sign, vreinterpretq_s32_f32(a.val)));
|
||||
return v_int32x4(vcvtq_s32_f32(vaddq_f32(a.val, vreinterpretq_f32_s32(v_addition))));
|
||||
}
|
||||
|
||||
inline v_int32x4 v_floor(const v_float32x4& a)
|
||||
{
|
||||
int32x4_t a1 = vcvtq_s32_f32(a.val);
|
||||
uint32x4_t mask = vcgtq_f32(vcvtq_f32_s32(a1), a.val);
|
||||
return v_int32x4(vaddq_s32(a1, vreinterpretq_s32_u32(mask)));
|
||||
}
|
||||
|
||||
inline v_int32x4 v_ceil(const v_float32x4& a)
|
||||
{
|
||||
int32x4_t a1 = vcvtq_s32_f32(a.val);
|
||||
uint32x4_t mask = vcgtq_f32(a.val, vcvtq_f32_s32(a1));
|
||||
return v_int32x4(vsubq_s32(a1, vreinterpretq_s32_u32(mask)));
|
||||
}
|
||||
|
||||
inline v_int32x4 v_trunc(const v_float32x4& a)
|
||||
{ return v_int32x4(vcvtq_s32_f32(a.val)); }
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(_Tpvec, suffix) \
|
||||
inline void transpose4x4(const v_##_Tpvec& a0, const v_##_Tpvec& a1, \
|
||||
const v_##_Tpvec& a2, const v_##_Tpvec& a3, \
|
||||
v_##_Tpvec& b0, v_##_Tpvec& b1, \
|
||||
v_##_Tpvec& b2, v_##_Tpvec& b3) \
|
||||
{ \
|
||||
/* m00 m01 m02 m03 */ \
|
||||
/* m10 m11 m12 m13 */ \
|
||||
/* m20 m21 m22 m23 */ \
|
||||
/* m30 m31 m32 m33 */ \
|
||||
_Tpvec##x2_t t0 = vtrnq_##suffix(a0.val, a1.val); \
|
||||
_Tpvec##x2_t t1 = vtrnq_##suffix(a2.val, a3.val); \
|
||||
/* m00 m10 m02 m12 */ \
|
||||
/* m01 m11 m03 m13 */ \
|
||||
/* m20 m30 m22 m32 */ \
|
||||
/* m21 m31 m23 m33 */ \
|
||||
b0.val = vcombine_##suffix(vget_low_##suffix(t0.val[0]), vget_low_##suffix(t1.val[0])); \
|
||||
b1.val = vcombine_##suffix(vget_low_##suffix(t0.val[1]), vget_low_##suffix(t1.val[1])); \
|
||||
b2.val = vcombine_##suffix(vget_high_##suffix(t0.val[0]), vget_high_##suffix(t1.val[0])); \
|
||||
b3.val = vcombine_##suffix(vget_high_##suffix(t0.val[1]), vget_high_##suffix(t1.val[1])); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(uint32x4, u32)
|
||||
OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(int32x4, s32)
|
||||
OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(float32x4, f32)
|
||||
|
||||
#define OPENCV_HAL_IMPL_NEON_INTERLEAVED(_Tpvec, _Tp, suffix) \
|
||||
inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, v_##_Tpvec& c) \
|
||||
{ \
|
||||
_Tpvec##x3_t v = vld3q_##suffix(ptr); \
|
||||
a.val = v.val[0]; \
|
||||
b.val = v.val[1]; \
|
||||
c.val = v.val[2]; \
|
||||
} \
|
||||
inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, \
|
||||
v_##_Tpvec& c, v_##_Tpvec& d) \
|
||||
{ \
|
||||
_Tpvec##x4_t v = vld4q_##suffix(ptr); \
|
||||
a.val = v.val[0]; \
|
||||
b.val = v.val[1]; \
|
||||
c.val = v.val[2]; \
|
||||
d.val = v.val[3]; \
|
||||
} \
|
||||
inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, const v_##_Tpvec& c) \
|
||||
{ \
|
||||
_Tpvec##x3_t v; \
|
||||
v.val[0] = a.val; \
|
||||
v.val[1] = b.val; \
|
||||
v.val[2] = c.val; \
|
||||
vst3q_##suffix(ptr, v); \
|
||||
} \
|
||||
inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \
|
||||
const v_##_Tpvec& c, const v_##_Tpvec& d) \
|
||||
{ \
|
||||
_Tpvec##x4_t v; \
|
||||
v.val[0] = a.val; \
|
||||
v.val[1] = b.val; \
|
||||
v.val[2] = c.val; \
|
||||
v.val[3] = d.val; \
|
||||
vst4q_##suffix(ptr, v); \
|
||||
}
|
||||
|
||||
OPENCV_HAL_IMPL_NEON_INTERLEAVED(uint8x16, uchar, u8)
|
||||
OPENCV_HAL_IMPL_NEON_INTERLEAVED(int8x16, schar, s8)
|
||||
OPENCV_HAL_IMPL_NEON_INTERLEAVED(uint16x8, ushort, u16)
|
||||
OPENCV_HAL_IMPL_NEON_INTERLEAVED(int16x8, short, s16)
|
||||
OPENCV_HAL_IMPL_NEON_INTERLEAVED(uint32x4, unsigned, u32)
|
||||
OPENCV_HAL_IMPL_NEON_INTERLEAVED(int32x4, int, s32)
|
||||
OPENCV_HAL_IMPL_NEON_INTERLEAVED(float32x4, float, f32)
|
||||
|
||||
inline v_float32x4 v_cvt_f32(const v_int32x4& a)
|
||||
{
|
||||
return v_float32x4(vcvtq_f32_s32(a.val));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
1544
modules/hal/include/opencv2/hal/intrin_sse.hpp
Normal file
1544
modules/hal/include/opencv2/hal/intrin_sse.hpp
Normal file
File diff suppressed because it is too large
Load Diff
47
modules/hal/src/arithm.cpp
Normal file
47
modules/hal/src/arithm.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace cv { namespace hal {
|
||||
|
||||
}}
|
47
modules/hal/src/color.cpp
Normal file
47
modules/hal/src/color.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace cv { namespace hal {
|
||||
|
||||
}}
|
47
modules/hal/src/filter.cpp
Normal file
47
modules/hal/src/filter.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace cv { namespace hal {
|
||||
|
||||
}}
|
1352
modules/hal/src/mathfuncs.cpp
Normal file
1352
modules/hal/src/mathfuncs.cpp
Normal file
File diff suppressed because it is too large
Load Diff
208
modules/hal/src/matrix.cpp
Normal file
208
modules/hal/src/matrix.cpp
Normal file
@ -0,0 +1,208 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace cv { namespace hal {
|
||||
|
||||
/****************************************************************************************\
|
||||
* LU & Cholesky implementation for small matrices *
|
||||
\****************************************************************************************/
|
||||
|
||||
template<typename _Tp> static inline int
|
||||
LUImpl(_Tp* A, size_t astep, int m, _Tp* b, size_t bstep, int n)
|
||||
{
|
||||
int i, j, k, p = 1;
|
||||
astep /= sizeof(A[0]);
|
||||
bstep /= sizeof(b[0]);
|
||||
|
||||
for( i = 0; i < m; i++ )
|
||||
{
|
||||
k = i;
|
||||
|
||||
for( j = i+1; j < m; j++ )
|
||||
if( std::abs(A[j*astep + i]) > std::abs(A[k*astep + i]) )
|
||||
k = j;
|
||||
|
||||
if( std::abs(A[k*astep + i]) < std::numeric_limits<_Tp>::epsilon() )
|
||||
return 0;
|
||||
|
||||
if( k != i )
|
||||
{
|
||||
for( j = i; j < m; j++ )
|
||||
std::swap(A[i*astep + j], A[k*astep + j]);
|
||||
if( b )
|
||||
for( j = 0; j < n; j++ )
|
||||
std::swap(b[i*bstep + j], b[k*bstep + j]);
|
||||
p = -p;
|
||||
}
|
||||
|
||||
_Tp d = -1/A[i*astep + i];
|
||||
|
||||
for( j = i+1; j < m; j++ )
|
||||
{
|
||||
_Tp alpha = A[j*astep + i]*d;
|
||||
|
||||
for( k = i+1; k < m; k++ )
|
||||
A[j*astep + k] += alpha*A[i*astep + k];
|
||||
|
||||
if( b )
|
||||
for( k = 0; k < n; k++ )
|
||||
b[j*bstep + k] += alpha*b[i*bstep + k];
|
||||
}
|
||||
|
||||
A[i*astep + i] = -d;
|
||||
}
|
||||
|
||||
if( b )
|
||||
{
|
||||
for( i = m-1; i >= 0; i-- )
|
||||
for( j = 0; j < n; j++ )
|
||||
{
|
||||
_Tp s = b[i*bstep + j];
|
||||
for( k = i+1; k < m; k++ )
|
||||
s -= A[i*astep + k]*b[k*bstep + j];
|
||||
b[i*bstep + j] = s*A[i*astep + i];
|
||||
}
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
int LU(float* A, size_t astep, int m, float* b, size_t bstep, int n)
|
||||
{
|
||||
return LUImpl(A, astep, m, b, bstep, n);
|
||||
}
|
||||
|
||||
|
||||
int LU(double* A, size_t astep, int m, double* b, size_t bstep, int n)
|
||||
{
|
||||
return LUImpl(A, astep, m, b, bstep, n);
|
||||
}
|
||||
|
||||
|
||||
template<typename _Tp> static inline bool
|
||||
CholImpl(_Tp* A, size_t astep, int m, _Tp* b, size_t bstep, int n)
|
||||
{
|
||||
_Tp* L = A;
|
||||
int i, j, k;
|
||||
double s;
|
||||
astep /= sizeof(A[0]);
|
||||
bstep /= sizeof(b[0]);
|
||||
|
||||
for( i = 0; i < m; i++ )
|
||||
{
|
||||
for( j = 0; j < i; j++ )
|
||||
{
|
||||
s = A[i*astep + j];
|
||||
for( k = 0; k < j; k++ )
|
||||
s -= L[i*astep + k]*L[j*astep + k];
|
||||
L[i*astep + j] = (_Tp)(s*L[j*astep + j]);
|
||||
}
|
||||
s = A[i*astep + i];
|
||||
for( k = 0; k < j; k++ )
|
||||
{
|
||||
double t = L[i*astep + k];
|
||||
s -= t*t;
|
||||
}
|
||||
if( s < std::numeric_limits<_Tp>::epsilon() )
|
||||
return false;
|
||||
L[i*astep + i] = (_Tp)(1./std::sqrt(s));
|
||||
}
|
||||
|
||||
if( !b )
|
||||
return true;
|
||||
|
||||
// LLt x = b
|
||||
// 1: L y = b
|
||||
// 2. Lt x = y
|
||||
|
||||
/*
|
||||
[ L00 ] y0 b0
|
||||
[ L10 L11 ] y1 = b1
|
||||
[ L20 L21 L22 ] y2 b2
|
||||
[ L30 L31 L32 L33 ] y3 b3
|
||||
|
||||
[ L00 L10 L20 L30 ] x0 y0
|
||||
[ L11 L21 L31 ] x1 = y1
|
||||
[ L22 L32 ] x2 y2
|
||||
[ L33 ] x3 y3
|
||||
*/
|
||||
|
||||
for( i = 0; i < m; i++ )
|
||||
{
|
||||
for( j = 0; j < n; j++ )
|
||||
{
|
||||
s = b[i*bstep + j];
|
||||
for( k = 0; k < i; k++ )
|
||||
s -= L[i*astep + k]*b[k*bstep + j];
|
||||
b[i*bstep + j] = (_Tp)(s*L[i*astep + i]);
|
||||
}
|
||||
}
|
||||
|
||||
for( i = m-1; i >= 0; i-- )
|
||||
{
|
||||
for( j = 0; j < n; j++ )
|
||||
{
|
||||
s = b[i*bstep + j];
|
||||
for( k = m-1; k > i; k-- )
|
||||
s -= L[k*astep + i]*b[k*bstep + j];
|
||||
b[i*bstep + j] = (_Tp)(s*L[i*astep + i]);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Cholesky(float* A, size_t astep, int m, float* b, size_t bstep, int n)
|
||||
{
|
||||
return CholImpl(A, astep, m, b, bstep, n);
|
||||
}
|
||||
|
||||
bool Cholesky(double* A, size_t astep, int m, double* b, size_t bstep, int n)
|
||||
{
|
||||
return CholImpl(A, astep, m, b, bstep, n);
|
||||
}
|
||||
|
||||
}}
|
@ -1,2 +1,49 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "opencv2/hal.hpp"
|
||||
#include "opencv2/hal/intrin.hpp"
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
#include <limits>
|
||||
#include <float.h>
|
||||
|
47
modules/hal/src/resize.cpp
Normal file
47
modules/hal/src/resize.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace cv { namespace hal {
|
||||
|
||||
}}
|
@ -80,10 +80,10 @@ static const uchar popCountTable4[] =
|
||||
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
|
||||
};
|
||||
|
||||
Error::Code normHamming(const uchar* a, int n, int & result)
|
||||
int normHamming(const uchar* a, int n)
|
||||
{
|
||||
int i = 0;
|
||||
result = 0;
|
||||
int result = 0;
|
||||
#if CV_NEON
|
||||
{
|
||||
uint32x4_t bits = vmovq_n_u32(0);
|
||||
@ -104,13 +104,13 @@ Error::Code normHamming(const uchar* a, int n, int & result)
|
||||
popCountTable[a[i+2]] + popCountTable[a[i+3]];
|
||||
for( ; i < n; i++ )
|
||||
result += popCountTable[a[i]];
|
||||
return Error::Ok;
|
||||
return result;
|
||||
}
|
||||
|
||||
Error::Code normHamming(const uchar* a, const uchar* b, int n, int & result)
|
||||
int normHamming(const uchar* a, const uchar* b, int n)
|
||||
{
|
||||
int i = 0;
|
||||
result = 0;
|
||||
int result = 0;
|
||||
#if CV_NEON
|
||||
{
|
||||
uint32x4_t bits = vmovq_n_u32(0);
|
||||
@ -133,44 +133,44 @@ Error::Code normHamming(const uchar* a, const uchar* b, int n, int & result)
|
||||
popCountTable[a[i+2] ^ b[i+2]] + popCountTable[a[i+3] ^ b[i+3]];
|
||||
for( ; i < n; i++ )
|
||||
result += popCountTable[a[i] ^ b[i]];
|
||||
return Error::Ok;
|
||||
return result;
|
||||
}
|
||||
|
||||
Error::Code normHamming(const uchar* a, int n, int cellSize, int & result)
|
||||
int normHamming(const uchar* a, int n, int cellSize)
|
||||
{
|
||||
if( cellSize == 1 )
|
||||
return normHamming(a, n, result);
|
||||
return normHamming(a, n);
|
||||
const uchar* tab = 0;
|
||||
if( cellSize == 2 )
|
||||
tab = popCountTable2;
|
||||
else if( cellSize == 4 )
|
||||
tab = popCountTable4;
|
||||
else
|
||||
return Error::Unknown;
|
||||
return -1;
|
||||
int i = 0;
|
||||
result = 0;
|
||||
int result = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= n - 4; i += 4 )
|
||||
result += tab[a[i]] + tab[a[i+1]] + tab[a[i+2]] + tab[a[i+3]];
|
||||
#endif
|
||||
for( ; i < n; i++ )
|
||||
result += tab[a[i]];
|
||||
return Error::Ok;
|
||||
return result;
|
||||
}
|
||||
|
||||
Error::Code normHamming(const uchar* a, const uchar* b, int n, int cellSize, int & result)
|
||||
int normHamming(const uchar* a, const uchar* b, int n, int cellSize)
|
||||
{
|
||||
if( cellSize == 1 )
|
||||
return normHamming(a, b, n, result);
|
||||
return normHamming(a, b, n);
|
||||
const uchar* tab = 0;
|
||||
if( cellSize == 2 )
|
||||
tab = popCountTable2;
|
||||
else if( cellSize == 4 )
|
||||
tab = popCountTable4;
|
||||
else
|
||||
return Error::Unknown;
|
||||
return -1;
|
||||
int i = 0;
|
||||
result = 0;
|
||||
int result = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= n - 4; i += 4 )
|
||||
result += tab[a[i] ^ b[i]] + tab[a[i+1] ^ b[i+1]] +
|
||||
@ -178,7 +178,129 @@ Error::Code normHamming(const uchar* a, const uchar* b, int n, int cellSize, int
|
||||
#endif
|
||||
for( ; i < n; i++ )
|
||||
result += tab[a[i] ^ b[i]];
|
||||
return Error::Ok;
|
||||
return result;
|
||||
}
|
||||
|
||||
float normL2Sqr_(const float* a, const float* b, int n)
|
||||
{
|
||||
int j = 0; float d = 0.f;
|
||||
#if CV_SSE
|
||||
float CV_DECL_ALIGNED(16) buf[4];
|
||||
__m128 d0 = _mm_setzero_ps(), d1 = _mm_setzero_ps();
|
||||
|
||||
for( ; j <= n - 8; j += 8 )
|
||||
{
|
||||
__m128 t0 = _mm_sub_ps(_mm_loadu_ps(a + j), _mm_loadu_ps(b + j));
|
||||
__m128 t1 = _mm_sub_ps(_mm_loadu_ps(a + j + 4), _mm_loadu_ps(b + j + 4));
|
||||
d0 = _mm_add_ps(d0, _mm_mul_ps(t0, t0));
|
||||
d1 = _mm_add_ps(d1, _mm_mul_ps(t1, t1));
|
||||
}
|
||||
_mm_store_ps(buf, _mm_add_ps(d0, d1));
|
||||
d = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
#endif
|
||||
{
|
||||
for( ; j <= n - 4; j += 4 )
|
||||
{
|
||||
float t0 = a[j] - b[j], t1 = a[j+1] - b[j+1], t2 = a[j+2] - b[j+2], t3 = a[j+3] - b[j+3];
|
||||
d += t0*t0 + t1*t1 + t2*t2 + t3*t3;
|
||||
}
|
||||
}
|
||||
|
||||
for( ; j < n; j++ )
|
||||
{
|
||||
float t = a[j] - b[j];
|
||||
d += t*t;
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
float normL1_(const float* a, const float* b, int n)
|
||||
{
|
||||
int j = 0; float d = 0.f;
|
||||
#if CV_SSE
|
||||
float CV_DECL_ALIGNED(16) buf[4];
|
||||
static const int CV_DECL_ALIGNED(16) absbuf[4] = {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
|
||||
__m128 d0 = _mm_setzero_ps(), d1 = _mm_setzero_ps();
|
||||
__m128 absmask = _mm_load_ps((const float*)absbuf);
|
||||
|
||||
for( ; j <= n - 8; j += 8 )
|
||||
{
|
||||
__m128 t0 = _mm_sub_ps(_mm_loadu_ps(a + j), _mm_loadu_ps(b + j));
|
||||
__m128 t1 = _mm_sub_ps(_mm_loadu_ps(a + j + 4), _mm_loadu_ps(b + j + 4));
|
||||
d0 = _mm_add_ps(d0, _mm_and_ps(t0, absmask));
|
||||
d1 = _mm_add_ps(d1, _mm_and_ps(t1, absmask));
|
||||
}
|
||||
_mm_store_ps(buf, _mm_add_ps(d0, d1));
|
||||
d = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
#elif CV_NEON
|
||||
float32x4_t v_sum = vdupq_n_f32(0.0f);
|
||||
for ( ; j <= n - 4; j += 4)
|
||||
v_sum = vaddq_f32(v_sum, vabdq_f32(vld1q_f32(a + j), vld1q_f32(b + j)));
|
||||
|
||||
float CV_DECL_ALIGNED(16) buf[4];
|
||||
vst1q_f32(buf, v_sum);
|
||||
d = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
#endif
|
||||
{
|
||||
for( ; j <= n - 4; j += 4 )
|
||||
{
|
||||
d += std::abs(a[j] - b[j]) + std::abs(a[j+1] - b[j+1]) +
|
||||
std::abs(a[j+2] - b[j+2]) + std::abs(a[j+3] - b[j+3]);
|
||||
}
|
||||
}
|
||||
|
||||
for( ; j < n; j++ )
|
||||
d += std::abs(a[j] - b[j]);
|
||||
return d;
|
||||
}
|
||||
|
||||
int normL1_(const uchar* a, const uchar* b, int n)
|
||||
{
|
||||
int j = 0, d = 0;
|
||||
#if CV_SSE
|
||||
__m128i d0 = _mm_setzero_si128();
|
||||
|
||||
for( ; j <= n - 16; j += 16 )
|
||||
{
|
||||
__m128i t0 = _mm_loadu_si128((const __m128i*)(a + j));
|
||||
__m128i t1 = _mm_loadu_si128((const __m128i*)(b + j));
|
||||
|
||||
d0 = _mm_add_epi32(d0, _mm_sad_epu8(t0, t1));
|
||||
}
|
||||
|
||||
for( ; j <= n - 4; j += 4 )
|
||||
{
|
||||
__m128i t0 = _mm_cvtsi32_si128(*(const int*)(a + j));
|
||||
__m128i t1 = _mm_cvtsi32_si128(*(const int*)(b + j));
|
||||
|
||||
d0 = _mm_add_epi32(d0, _mm_sad_epu8(t0, t1));
|
||||
}
|
||||
d = _mm_cvtsi128_si32(_mm_add_epi32(d0, _mm_unpackhi_epi64(d0, d0)));
|
||||
#elif CV_NEON
|
||||
uint32x4_t v_sum = vdupq_n_u32(0.0f);
|
||||
for ( ; j <= n - 16; j += 16)
|
||||
{
|
||||
uint8x16_t v_dst = vabdq_u8(vld1q_u8(a + j), vld1q_u8(b + j));
|
||||
uint16x8_t v_low = vmovl_u8(vget_low_u8(v_dst)), v_high = vmovl_u8(vget_high_u8(v_dst));
|
||||
v_sum = vaddq_u32(v_sum, vaddl_u16(vget_low_u16(v_low), vget_low_u16(v_high)));
|
||||
v_sum = vaddq_u32(v_sum, vaddl_u16(vget_high_u16(v_low), vget_high_u16(v_high)));
|
||||
}
|
||||
|
||||
uint CV_DECL_ALIGNED(16) buf[4];
|
||||
vst1q_u32(buf, v_sum);
|
||||
d = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
#endif
|
||||
{
|
||||
for( ; j <= n - 4; j += 4 )
|
||||
{
|
||||
d += std::abs(a[j] - b[j]) + std::abs(a[j+1] - b[j+1]) +
|
||||
std::abs(a[j+2] - b[j+2]) + std::abs(a[j+3] - b[j+3]);
|
||||
}
|
||||
}
|
||||
for( ; j < n; j++ )
|
||||
d += std::abs(a[j] - b[j]);
|
||||
return d;
|
||||
}
|
||||
|
||||
}} //cv::hal
|
47
modules/hal/src/warp.cpp
Normal file
47
modules/hal/src/warp.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace cv { namespace hal {
|
||||
|
||||
}}
|
@ -448,3 +448,81 @@ protected:
|
||||
};
|
||||
|
||||
TEST(Imgcodecs_Drawing, fillconvexpoly_clipping) { CV_FillConvexPolyTest test; test.safe_run(); }
|
||||
|
||||
class CV_DrawingTest_UTF8 : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_DrawingTest_UTF8() {}
|
||||
~CV_DrawingTest_UTF8() {}
|
||||
protected:
|
||||
void run(int)
|
||||
{
|
||||
vector<string> lines;
|
||||
lines.push_back("abcdefghijklmnopqrstuvwxyz1234567890");
|
||||
// cyrillic letters small
|
||||
lines.push_back("\xD0\xB0\xD0\xB1\xD0\xB2\xD0\xB3\xD0\xB4\xD0\xB5\xD1\x91\xD0\xB6\xD0\xB7"
|
||||
"\xD0\xB8\xD0\xB9\xD0\xBA\xD0\xBB\xD0\xBC\xD0\xBD\xD0\xBE\xD0\xBF\xD1\x80"
|
||||
"\xD1\x81\xD1\x82\xD1\x83\xD1\x84\xD1\x85\xD1\x86\xD1\x87\xD1\x88\xD1\x89"
|
||||
"\xD1\x8A\xD1\x8B\xD1\x8C\xD1\x8D\xD1\x8E\xD1\x8F");
|
||||
// cyrillic letters capital
|
||||
lines.push_back("\xD0\x90\xD0\x91\xD0\x92\xD0\x93\xD0\x94\xD0\x95\xD0\x81\xD0\x96\xD0\x97"
|
||||
"\xD0\x98\xD0\x99\xD0\x9A\xD0\x9B\xD0\x9C\xD0\x9D\xD0\x9E\xD0\x9F\xD0\xA0"
|
||||
"\xD0\xA1\xD0\xA2\xD0\xA3\xD0\xA4\xD0\xA5\xD0\xA6\xD0\xA7\xD0\xA8\xD0\xA9"
|
||||
"\xD0\xAA\xD0\xAB\xD0\xAC\xD0\xAD\xD0\xAE\xD0\xAF");
|
||||
// bounds
|
||||
lines.push_back("-\xD0\x80-\xD0\x8E-\xD0\x8F-");
|
||||
lines.push_back("-\xD1\x90-\xD1\x91-\xD1\xBF-");
|
||||
// bad utf8
|
||||
lines.push_back("-\x81-\x82-\x83-");
|
||||
lines.push_back("--\xF0--");
|
||||
lines.push_back("-\xF0");
|
||||
|
||||
vector<int> fonts;
|
||||
fonts.push_back(FONT_HERSHEY_SIMPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_PLAIN);
|
||||
fonts.push_back(FONT_HERSHEY_DUPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_COMPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_TRIPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_COMPLEX_SMALL);
|
||||
fonts.push_back(FONT_HERSHEY_SCRIPT_SIMPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_SCRIPT_COMPLEX);
|
||||
|
||||
vector<Mat> results;
|
||||
Size bigSize(0, 0);
|
||||
for (vector<int>::const_iterator font = fonts.begin(); font != fonts.end(); ++font)
|
||||
{
|
||||
for (int italic = 0; italic <= FONT_ITALIC; italic += FONT_ITALIC)
|
||||
{
|
||||
for (vector<string>::const_iterator line = lines.begin(); line != lines.end(); ++line)
|
||||
{
|
||||
const float fontScale = 1;
|
||||
const int thickness = 1;
|
||||
const Scalar color(20,20,20);
|
||||
int baseline = 0;
|
||||
|
||||
Size textSize = getTextSize(*line, *font | italic, fontScale, thickness, &baseline);
|
||||
Point textOrg(0, textSize.height + 2);
|
||||
Mat img(textSize + Size(0, baseline), CV_8UC3, Scalar(255, 255, 255));
|
||||
putText(img, *line, textOrg, *font | italic, fontScale, color, thickness, CV_AA);
|
||||
|
||||
results.push_back(img);
|
||||
bigSize.width = max(bigSize.width, img.size().width);
|
||||
bigSize.height += img.size().height + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int shift = 0;
|
||||
Mat result(bigSize, CV_8UC3, Scalar(100, 100, 100));
|
||||
for (vector<Mat>::const_iterator img = results.begin(); img != results.end(); ++img)
|
||||
{
|
||||
Rect roi(Point(0, shift), img->size());
|
||||
Mat sub(result, roi);
|
||||
img->copyTo(sub);
|
||||
shift += img->size().height + 1;
|
||||
}
|
||||
imwrite("/tmp/all_fonts.png", result);
|
||||
}
|
||||
};
|
||||
|
||||
TEST(Highgui_Drawing, utf8_support) { CV_DrawingTest_UTF8 test; test.safe_run(); }
|
||||
|
@ -1941,7 +1941,11 @@ static const int HersheyComplex[] = {
|
||||
2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2223, 2084,
|
||||
2224, 2247, 587, 2249, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111,
|
||||
2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126,
|
||||
2225, 2229, 2226, 2246 };
|
||||
2225, 2229, 2226, 2246, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811,
|
||||
2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826,
|
||||
2827, 2828, 2829, 2830, 2831, 2832, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909,
|
||||
2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924,
|
||||
2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932};
|
||||
|
||||
static const int HersheyComplexItalic[] = {
|
||||
(9 + 12*16) + FONT_ITALIC_ALPHA + FONT_ITALIC_DIGIT + FONT_ITALIC_PUNCT +
|
||||
@ -2033,6 +2037,50 @@ static const int* getFontData(int fontFace)
|
||||
return ascii;
|
||||
}
|
||||
|
||||
inline void readCheck(int &c, int &i, const String &text, int fontFace)
|
||||
{
|
||||
|
||||
int leftBoundary = ' ', rightBoundary = 127;
|
||||
|
||||
if(c >= 0x80 && fontFace == FONT_HERSHEY_COMPLEX)
|
||||
{
|
||||
if(c == 0xD0 && (uchar)text[i + 1] >= 0x90 && (uchar)text[i + 1] <= 0xBF)
|
||||
{
|
||||
c = (uchar)text[++i] - 17;
|
||||
leftBoundary = 127;
|
||||
rightBoundary = 175;
|
||||
}
|
||||
else if(c == 0xD1 && (uchar)text[i + 1] >= 0x80 && (uchar)text[i + 1] <= 0x8F)
|
||||
{
|
||||
c = (uchar)text[++i] + 47;
|
||||
leftBoundary = 175;
|
||||
rightBoundary = 191;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(c >= 0xC0 && text[i+1] != 0) //2 bytes utf
|
||||
i++;
|
||||
|
||||
if(c >= 0xE0 && text[i+1] != 0) //3 bytes utf
|
||||
i++;
|
||||
|
||||
if(c >= 0xF0 && text[i+1] != 0) //4 bytes utf
|
||||
i++;
|
||||
|
||||
if(c >= 0xF8 && text[i+1] != 0) //5 bytes utf
|
||||
i++;
|
||||
|
||||
if(c >= 0xFC && text[i+1] != 0) //6 bytes utf
|
||||
i++;
|
||||
|
||||
c = '?';
|
||||
}
|
||||
}
|
||||
|
||||
if(c >= rightBoundary || c < leftBoundary)
|
||||
c = '?';
|
||||
}
|
||||
|
||||
extern const char* g_HersheyGlyphs[];
|
||||
|
||||
void putText( InputOutputArray _img, const String& text, Point org,
|
||||
@ -2066,8 +2114,7 @@ void putText( InputOutputArray _img, const String& text, Point org,
|
||||
int c = (uchar)text[i];
|
||||
Point p;
|
||||
|
||||
if( c >= 127 || c < ' ' )
|
||||
c = '?';
|
||||
readCheck(c, i, text, fontFace);
|
||||
|
||||
const char* ptr = faces[ascii[(c-' ')+1]];
|
||||
p.x = (uchar)ptr[0] - 'R';
|
||||
@ -2114,8 +2161,7 @@ Size getTextSize( const String& text, int fontFace, double fontScale, int thickn
|
||||
int c = (uchar)text[i];
|
||||
Point p;
|
||||
|
||||
if( c >= 127 || c < ' ' )
|
||||
c = '?';
|
||||
readCheck(c, i, text, fontFace);
|
||||
|
||||
const char* ptr = faces[ascii[(c-' ')+1]];
|
||||
p.x = (uchar)ptr[0] - 'R';
|
||||
|
@ -1820,9 +1820,14 @@ static bool ocl_morphologyEx(InputArray _src, OutputArray _dst, int op,
|
||||
#endif
|
||||
|
||||
void cv::morphologyEx( InputArray _src, OutputArray _dst, int op,
|
||||
InputArray kernel, Point anchor, int iterations,
|
||||
InputArray _kernel, Point anchor, int iterations,
|
||||
int borderType, const Scalar& borderValue )
|
||||
{
|
||||
Mat kernel = _kernel.getMat();
|
||||
if (kernel.empty())
|
||||
{
|
||||
kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(1,1));
|
||||
}
|
||||
#ifdef HAVE_OPENCL
|
||||
Size ksize = kernel.size();
|
||||
anchor = normalizeAnchor(anchor, ksize);
|
||||
|
@ -64,7 +64,7 @@ __kernel void maxEigenVal(__global const uchar * srcptr, int src_step, int src_o
|
||||
int src_index = mad24(id / cols, src_step, mad24((id % cols), (int)sizeof(float), src_offset));
|
||||
#ifdef HAVE_MASK
|
||||
int mask_index = mad24(id / cols, mask_step, id % cols + mask_offset);
|
||||
if (mask[mask_index])
|
||||
if (maskptr[mask_index])
|
||||
#endif
|
||||
maxval = max(maxval, *(__global const float *)(srcptr + src_index));
|
||||
}
|
||||
|
@ -446,10 +446,9 @@ cv::RotatedRect cv::fitEllipse( InputArray _points )
|
||||
|
||||
// store angle and radii
|
||||
rp[4] = -0.5 * atan2(gfp[2], gfp[1] - gfp[0]); // convert from APP angle usage
|
||||
t = sin(-2.0 * rp[4]);
|
||||
if( fabs(t) > fabs(gfp[2])*min_eps )
|
||||
t = gfp[2]/t;
|
||||
else
|
||||
if( fabs(gfp[2]) > min_eps )
|
||||
t = gfp[2]/sin(-2.0 * rp[4]);
|
||||
else // ellipse is rotated by an integer multiple of pi/2
|
||||
t = gfp[1] - gfp[0];
|
||||
rp[2] = fabs(gfp[0] + gfp[1] - t);
|
||||
if( rp[2] > min_eps )
|
||||
|
@ -1239,7 +1239,6 @@ void CV_FitEllipseTest::run_func()
|
||||
box = (CvBox2D)cv::fitEllipse(cv::cvarrToMat(points));
|
||||
}
|
||||
|
||||
|
||||
int CV_FitEllipseTest::validate_test_results( int test_case_idx )
|
||||
{
|
||||
int code = CV_BaseShapeDescrTest::validate_test_results( test_case_idx );
|
||||
@ -1354,6 +1353,64 @@ protected:
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Regression test for incorrect fitEllipse result reported in Bug #3989
|
||||
// Check edge cases for rotation angles of ellipse ([-180, 90, 0, 90, 180] degrees)
|
||||
class CV_FitEllipseParallelTest : public CV_FitEllipseTest
|
||||
{
|
||||
public:
|
||||
CV_FitEllipseParallelTest();
|
||||
~CV_FitEllipseParallelTest();
|
||||
protected:
|
||||
void generate_point_set( void* points );
|
||||
void run_func(void);
|
||||
Mat pointsMat;
|
||||
};
|
||||
|
||||
CV_FitEllipseParallelTest::CV_FitEllipseParallelTest()
|
||||
{
|
||||
min_ellipse_size = 5;
|
||||
}
|
||||
|
||||
void CV_FitEllipseParallelTest::generate_point_set( void* )
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
int height = (int)(MAX(high.val[0] - low.val[0], min_ellipse_size));
|
||||
int width = (int)(MAX(high.val[1] - low.val[1], min_ellipse_size));
|
||||
const int angle = ( (cvtest::randInt(rng) % 5) - 2 ) * 90;
|
||||
const int dim = max(height, width);
|
||||
const Point center = Point(dim*2, dim*2);
|
||||
|
||||
if( width > height )
|
||||
{
|
||||
int t;
|
||||
CV_SWAP( width, height, t );
|
||||
}
|
||||
|
||||
Mat image = Mat::zeros(dim*4, dim*4, CV_8UC1);
|
||||
ellipse(image, center, Size(height, width), angle,
|
||||
0, 360, Scalar(255, 0, 0), 1, 8);
|
||||
|
||||
box0.center.x = (float)center.x;
|
||||
box0.center.y = (float)center.y;
|
||||
box0.size.width = (float)width*2;
|
||||
box0.size.height = (float)height*2;
|
||||
box0.angle = (float)angle;
|
||||
|
||||
vector<vector<Point> > contours;
|
||||
findContours(image, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
|
||||
Mat(contours[0]).convertTo(pointsMat, CV_32F);
|
||||
}
|
||||
|
||||
void CV_FitEllipseParallelTest::run_func()
|
||||
{
|
||||
box = (CvBox2D)cv::fitEllipse(pointsMat);
|
||||
}
|
||||
|
||||
CV_FitEllipseParallelTest::~CV_FitEllipseParallelTest(){
|
||||
pointsMat.release();
|
||||
}
|
||||
|
||||
/****************************************************************************************\
|
||||
* FitLine Test *
|
||||
\****************************************************************************************/
|
||||
@ -1377,7 +1434,7 @@ protected:
|
||||
|
||||
CV_FitLineTest::CV_FitLineTest()
|
||||
{
|
||||
min_log_size = 5; // for robust ellipse fitting a dozen of points is needed at least
|
||||
min_log_size = 5; // for robust line fitting a dozen of points is needed at least
|
||||
max_log_size = 10;
|
||||
max_noise = 0.05;
|
||||
}
|
||||
@ -1866,6 +1923,7 @@ TEST(Imgproc_MinTriangle, accuracy) { CV_MinTriangleTest test; test.safe_run();
|
||||
TEST(Imgproc_MinCircle, accuracy) { CV_MinCircleTest test; test.safe_run(); }
|
||||
TEST(Imgproc_ContourPerimeter, accuracy) { CV_PerimeterTest test; test.safe_run(); }
|
||||
TEST(Imgproc_FitEllipse, accuracy) { CV_FitEllipseTest test; test.safe_run(); }
|
||||
TEST(Imgproc_FitEllipse, parallel) { CV_FitEllipseParallelTest test; test.safe_run(); }
|
||||
TEST(Imgproc_FitLine, accuracy) { CV_FitLineTest test; test.safe_run(); }
|
||||
TEST(Imgproc_ContourMoments, accuracy) { CV_ContourMomentsTest test; test.safe_run(); }
|
||||
TEST(Imgproc_ContourPerimeterSlice, accuracy) { CV_PerimeterAreaSliceTest test; test.safe_run(); }
|
||||
|
@ -174,8 +174,8 @@ endforeach()
|
||||
file(REMOVE_RECURSE "${probe_dir}")
|
||||
|
||||
if(NOT ANDROID)
|
||||
ocv_list_filterout(handwritten_java_sources "/(engine|android)\\\\+")
|
||||
ocv_list_filterout(handwritten_aidl_sources "/(engine|android)\\\\+")
|
||||
ocv_list_filterout(handwritten_java_sources "/(engine3|android)\\\\+")
|
||||
ocv_list_filterout(handwritten_aidl_sources "/(engine3|android)\\\\+")
|
||||
else()
|
||||
file(GLOB_RECURSE handwrittren_lib_project_files_rel RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/" "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/*")
|
||||
list(REMOVE_ITEM handwrittren_lib_project_files_rel "${ANDROID_MANIFEST_FILE}")
|
||||
|
@ -4,7 +4,7 @@ import java.io.File;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.engine.OpenCVEngineInterface;
|
||||
import org.opencv.engine3.OpenCVEngineInterface;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
@ -21,8 +21,8 @@ class AsyncServiceHelper
|
||||
final LoaderCallbackInterface Callback)
|
||||
{
|
||||
AsyncServiceHelper helper = new AsyncServiceHelper(Version, AppContext, Callback);
|
||||
Intent intent = new Intent("org.opencv.engine.BIND");
|
||||
intent.setPackage("org.opencv.engine");
|
||||
Intent intent = new Intent("org.opencv.engine3.BIND");
|
||||
intent.setPackage("org.opencv.engine3");
|
||||
if (AppContext.bindService(intent, helper.mServiceConnection, Context.BIND_AUTO_CREATE))
|
||||
{
|
||||
return true;
|
||||
@ -77,7 +77,7 @@ class AsyncServiceHelper
|
||||
private LoaderCallbackInterface mUserAppCallback = Callback;
|
||||
public String getPackageName()
|
||||
{
|
||||
return "OpenCV Manager";
|
||||
return "OpenCV3 Manager";
|
||||
}
|
||||
public void install() {
|
||||
Log.d(TAG, "Trying to install OpenCV Manager via Google Play");
|
||||
@ -123,7 +123,7 @@ class AsyncServiceHelper
|
||||
private LoaderCallbackInterface mUserAppCallback = Callback;
|
||||
public String getPackageName()
|
||||
{
|
||||
return "OpenCV Manager";
|
||||
return "OpenCV3 Manager";
|
||||
}
|
||||
public void install()
|
||||
{
|
||||
@ -151,7 +151,7 @@ class AsyncServiceHelper
|
||||
/**
|
||||
* URL of OpenCV Manager page on Google Play Market.
|
||||
*/
|
||||
protected static final String OPEN_CV_SERVICE_URL = "market://details?id=org.opencv.engine";
|
||||
protected static final String OPEN_CV_SERVICE_URL = "market://details?id=org.opencv.engine3";
|
||||
|
||||
protected ServiceConnection mServiceConnection = new ServiceConnection()
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
package org.opencv.engine;
|
||||
package org.opencv.engine3;
|
||||
|
||||
/**
|
||||
* Class provides a Java interface for OpenCV Engine Service. It's synchronous with native OpenCVEngine class.
|
@ -538,6 +538,8 @@ public:
|
||||
{
|
||||
kr.idx = cache_size;
|
||||
cache_size++;
|
||||
if (!lru_last)
|
||||
lru_last = i1+1;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -546,6 +548,8 @@ public:
|
||||
last.idx = -1;
|
||||
lru_cache[last.prev].next = 0;
|
||||
lru_last = last.prev;
|
||||
last.prev = 0;
|
||||
last.next = 0;
|
||||
}
|
||||
kernel->calc( sample_count, var_count, samples.ptr<float>(),
|
||||
samples.ptr<float>(i1), lru_cache_data.ptr<Qfloat>(kr.idx) );
|
||||
@ -561,6 +565,8 @@ public:
|
||||
else
|
||||
lru_first = kr.next;
|
||||
}
|
||||
if (lru_first)
|
||||
lru_cache[lru_first].prev = i1+1;
|
||||
kr.next = lru_first;
|
||||
kr.prev = 0;
|
||||
lru_first = i1+1;
|
||||
@ -1787,7 +1793,7 @@ public:
|
||||
if( !do_train( temp_train_samples, temp_train_responses ))
|
||||
continue;
|
||||
|
||||
for( i = 0; i < test_sample_count; i++ )
|
||||
for( i = 0; i < train_sample_count; i++ )
|
||||
{
|
||||
j = sidx[(i+start+train_sample_count) % sample_count];
|
||||
memcpy(temp_train_samples.ptr(i), samples.ptr(j), sample_size);
|
||||
|
@ -44,6 +44,9 @@
|
||||
#ifndef __OPENCV_DENOISING_ARRAYS_HPP__
|
||||
#define __OPENCV_DENOISING_ARRAYS_HPP__
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
template <class T>
|
||||
struct Array2d
|
||||
{
|
||||
@ -176,4 +179,6 @@ struct Array4d
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -49,7 +49,7 @@ namespace {
|
||||
template<typename _Tp> static inline bool
|
||||
decomposeCholesky(_Tp* A, size_t astep, int m)
|
||||
{
|
||||
if (!Cholesky(A, astep, m, 0, 0, 0))
|
||||
if (!hal::Cholesky(A, astep, m, 0, 0, 0))
|
||||
return false;
|
||||
astep /= sizeof(A[0]);
|
||||
for (int i = 0; i < m; ++i)
|
||||
|
@ -528,27 +528,27 @@ public:
|
||||
/** @brief Sets a property in the VideoCapture.
|
||||
|
||||
@param propId Property identifier. It can be one of the following:
|
||||
- **CV_CAP_PROP_POS_MSEC** Current position of the video file in milliseconds.
|
||||
- **CV_CAP_PROP_POS_FRAMES** 0-based index of the frame to be decoded/captured next.
|
||||
- **CV_CAP_PROP_POS_AVI_RATIO** Relative position of the video file: 0 - start of the
|
||||
- **CAP_PROP_POS_MSEC** Current position of the video file in milliseconds.
|
||||
- **CAP_PROP_POS_FRAMES** 0-based index of the frame to be decoded/captured next.
|
||||
- **CAP_PROP_POS_AVI_RATIO** Relative position of the video file: 0 - start of the
|
||||
film, 1 - end of the film.
|
||||
- **CV_CAP_PROP_FRAME_WIDTH** Width of the frames in the video stream.
|
||||
- **CV_CAP_PROP_FRAME_HEIGHT** Height of the frames in the video stream.
|
||||
- **CV_CAP_PROP_FPS** Frame rate.
|
||||
- **CV_CAP_PROP_FOURCC** 4-character code of codec.
|
||||
- **CV_CAP_PROP_FRAME_COUNT** Number of frames in the video file.
|
||||
- **CV_CAP_PROP_FORMAT** Format of the Mat objects returned by retrieve() .
|
||||
- **CV_CAP_PROP_MODE** Backend-specific value indicating the current capture mode.
|
||||
- **CV_CAP_PROP_BRIGHTNESS** Brightness of the image (only for cameras).
|
||||
- **CV_CAP_PROP_CONTRAST** Contrast of the image (only for cameras).
|
||||
- **CV_CAP_PROP_SATURATION** Saturation of the image (only for cameras).
|
||||
- **CV_CAP_PROP_HUE** Hue of the image (only for cameras).
|
||||
- **CV_CAP_PROP_GAIN** Gain of the image (only for cameras).
|
||||
- **CV_CAP_PROP_EXPOSURE** Exposure (only for cameras).
|
||||
- **CV_CAP_PROP_CONVERT_RGB** Boolean flags indicating whether images should be converted
|
||||
- **CAP_PROP_FRAME_WIDTH** Width of the frames in the video stream.
|
||||
- **CAP_PROP_FRAME_HEIGHT** Height of the frames in the video stream.
|
||||
- **CAP_PROP_FPS** Frame rate.
|
||||
- **CAP_PROP_FOURCC** 4-character code of codec.
|
||||
- **CAP_PROP_FRAME_COUNT** Number of frames in the video file.
|
||||
- **CAP_PROP_FORMAT** Format of the Mat objects returned by retrieve() .
|
||||
- **CAP_PROP_MODE** Backend-specific value indicating the current capture mode.
|
||||
- **CAP_PROP_BRIGHTNESS** Brightness of the image (only for cameras).
|
||||
- **CAP_PROP_CONTRAST** Contrast of the image (only for cameras).
|
||||
- **CAP_PROP_SATURATION** Saturation of the image (only for cameras).
|
||||
- **CAP_PROP_HUE** Hue of the image (only for cameras).
|
||||
- **CAP_PROP_GAIN** Gain of the image (only for cameras).
|
||||
- **CAP_PROP_EXPOSURE** Exposure (only for cameras).
|
||||
- **CAP_PROP_CONVERT_RGB** Boolean flags indicating whether images should be converted
|
||||
to RGB.
|
||||
- **CV_CAP_PROP_WHITE_BALANCE** Currently unsupported
|
||||
- **CV_CAP_PROP_RECTIFICATION** Rectification flag for stereo cameras (note: only supported
|
||||
- **CAP_PROP_WHITE_BALANCE** Currently unsupported
|
||||
- **CAP_PROP_RECTIFICATION** Rectification flag for stereo cameras (note: only supported
|
||||
by DC1394 v 2.x backend currently)
|
||||
@param value Value of the property.
|
||||
*/
|
||||
@ -557,31 +557,31 @@ public:
|
||||
/** @brief Returns the specified VideoCapture property
|
||||
|
||||
@param propId Property identifier. It can be one of the following:
|
||||
- **CV_CAP_PROP_POS_MSEC** Current position of the video file in milliseconds or video
|
||||
- **CAP_PROP_POS_MSEC** Current position of the video file in milliseconds or video
|
||||
capture timestamp.
|
||||
- **CV_CAP_PROP_POS_FRAMES** 0-based index of the frame to be decoded/captured next.
|
||||
- **CV_CAP_PROP_POS_AVI_RATIO** Relative position of the video file: 0 - start of the
|
||||
- **CAP_PROP_POS_FRAMES** 0-based index of the frame to be decoded/captured next.
|
||||
- **CAP_PROP_POS_AVI_RATIO** Relative position of the video file: 0 - start of the
|
||||
film, 1 - end of the film.
|
||||
- **CV_CAP_PROP_FRAME_WIDTH** Width of the frames in the video stream.
|
||||
- **CV_CAP_PROP_FRAME_HEIGHT** Height of the frames in the video stream.
|
||||
- **CV_CAP_PROP_FPS** Frame rate.
|
||||
- **CV_CAP_PROP_FOURCC** 4-character code of codec.
|
||||
- **CV_CAP_PROP_FRAME_COUNT** Number of frames in the video file.
|
||||
- **CV_CAP_PROP_FORMAT** Format of the Mat objects returned by retrieve() .
|
||||
- **CV_CAP_PROP_MODE** Backend-specific value indicating the current capture mode.
|
||||
- **CV_CAP_PROP_BRIGHTNESS** Brightness of the image (only for cameras).
|
||||
- **CV_CAP_PROP_CONTRAST** Contrast of the image (only for cameras).
|
||||
- **CV_CAP_PROP_SATURATION** Saturation of the image (only for cameras).
|
||||
- **CV_CAP_PROP_HUE** Hue of the image (only for cameras).
|
||||
- **CV_CAP_PROP_GAIN** Gain of the image (only for cameras).
|
||||
- **CV_CAP_PROP_EXPOSURE** Exposure (only for cameras).
|
||||
- **CV_CAP_PROP_CONVERT_RGB** Boolean flags indicating whether images should be converted
|
||||
- **CAP_PROP_FRAME_WIDTH** Width of the frames in the video stream.
|
||||
- **CAP_PROP_FRAME_HEIGHT** Height of the frames in the video stream.
|
||||
- **CAP_PROP_FPS** Frame rate.
|
||||
- **CAP_PROP_FOURCC** 4-character code of codec.
|
||||
- **CAP_PROP_FRAME_COUNT** Number of frames in the video file.
|
||||
- **CAP_PROP_FORMAT** Format of the Mat objects returned by retrieve() .
|
||||
- **CAP_PROP_MODE** Backend-specific value indicating the current capture mode.
|
||||
- **CAP_PROP_BRIGHTNESS** Brightness of the image (only for cameras).
|
||||
- **CAP_PROP_CONTRAST** Contrast of the image (only for cameras).
|
||||
- **CAP_PROP_SATURATION** Saturation of the image (only for cameras).
|
||||
- **CAP_PROP_HUE** Hue of the image (only for cameras).
|
||||
- **CAP_PROP_GAIN** Gain of the image (only for cameras).
|
||||
- **CAP_PROP_EXPOSURE** Exposure (only for cameras).
|
||||
- **CAP_PROP_CONVERT_RGB** Boolean flags indicating whether images should be converted
|
||||
to RGB.
|
||||
- **CV_CAP_PROP_WHITE_BALANCE** Currently not supported
|
||||
- **CV_CAP_PROP_RECTIFICATION** Rectification flag for stereo cameras (note: only supported
|
||||
- **CAP_PROP_WHITE_BALANCE** Currently not supported
|
||||
- **CAP_PROP_RECTIFICATION** Rectification flag for stereo cameras (note: only supported
|
||||
by DC1394 v 2.x backend currently)
|
||||
|
||||
**Note**: When querying a property that is not supported by the backend used by the VideoCapture
|
||||
@note When querying a property that is not supported by the backend used by the VideoCapture
|
||||
class, value 0 is returned.
|
||||
*/
|
||||
CV_WRAP virtual double get(int propId) const;
|
||||
@ -659,7 +659,7 @@ public:
|
||||
- **VIDEOWRITER_PROP_QUALITY** Current quality of the encoded videostream.
|
||||
- **VIDEOWRITER_PROP_FRAMEBYTES** (Read-only) Size of just encoded video frame; note that the encoding order may be different from representation order.
|
||||
|
||||
**Note**: When querying a property that is not supported by the backend used by the VideoWriter
|
||||
@note When querying a property that is not supported by the backend used by the VideoWriter
|
||||
class, value 0 is returned.
|
||||
*/
|
||||
CV_WRAP virtual double get(int propId) const;
|
||||
|
@ -786,7 +786,9 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const
|
||||
case CV_FFMPEG_CAP_PROP_FRAME_HEIGHT:
|
||||
return (double)frame.height;
|
||||
case CV_FFMPEG_CAP_PROP_FPS:
|
||||
#if LIBAVCODEC_BUILD > 4753
|
||||
#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0)
|
||||
return av_q2d(video_st->avg_frame_rate);
|
||||
#elif LIBAVCODEC_BUILD > 4753
|
||||
return av_q2d(video_st->r_frame_rate);
|
||||
#else
|
||||
return (double)video_st->codec.frame_rate
|
||||
@ -834,7 +836,11 @@ int CvCapture_FFMPEG::get_bitrate() const
|
||||
|
||||
double CvCapture_FFMPEG::get_fps() const
|
||||
{
|
||||
#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0)
|
||||
double fps = r2d(ic->streams[video_stream]->avg_frame_rate);
|
||||
#else
|
||||
double fps = r2d(ic->streams[video_stream]->r_frame_rate);
|
||||
#endif
|
||||
|
||||
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
|
||||
if (fps < eps_zero)
|
||||
@ -995,6 +1001,7 @@ struct CvVideoWriter_FFMPEG
|
||||
int input_pix_fmt;
|
||||
Image_FFMPEG temp_image;
|
||||
int frame_width, frame_height;
|
||||
int frame_idx;
|
||||
bool ok;
|
||||
struct SwsContext *img_convert_ctx;
|
||||
};
|
||||
@ -1072,6 +1079,7 @@ void CvVideoWriter_FFMPEG::init()
|
||||
memset(&temp_image, 0, sizeof(temp_image));
|
||||
img_convert_ctx = 0;
|
||||
frame_width = frame_height = 0;
|
||||
frame_idx = 0;
|
||||
ok = false;
|
||||
}
|
||||
|
||||
@ -1223,7 +1231,7 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
|
||||
and qmin since they will be set to reasonable defaults by the libx264
|
||||
preset system. Also, use a crf encode with the default quality rating,
|
||||
this seems easier than finding an appropriate default bitrate. */
|
||||
if (c->codec_id == CODEC_ID_H264) {
|
||||
if (c->codec_id == AV_CODEC_ID_H264) {
|
||||
c->gop_size = -1;
|
||||
c->qmin = -1;
|
||||
c->bit_rate = 0;
|
||||
@ -1244,15 +1252,20 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
|
||||
|
||||
static const int OPENCV_NO_FRAMES_WRITTEN_CODE = 1000;
|
||||
|
||||
static int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, uint8_t * outbuf, uint32_t outbuf_size, AVFrame * picture )
|
||||
static int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st,
|
||||
#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0)
|
||||
uint8_t *, uint32_t,
|
||||
#else
|
||||
uint8_t * outbuf, uint32_t outbuf_size,
|
||||
#endif
|
||||
AVFrame * picture )
|
||||
{
|
||||
#if LIBAVFORMAT_BUILD > 4628
|
||||
AVCodecContext * c = video_st->codec;
|
||||
#else
|
||||
AVCodecContext * c = &(video_st->codec);
|
||||
#endif
|
||||
int out_size;
|
||||
int ret = 0;
|
||||
int ret = OPENCV_NO_FRAMES_WRITTEN_CODE;
|
||||
|
||||
if (oc->oformat->flags & AVFMT_RAWPICTURE) {
|
||||
/* raw video case. The API will change slightly in the near
|
||||
@ -1272,12 +1285,32 @@ static int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st,
|
||||
ret = av_write_frame(oc, &pkt);
|
||||
} else {
|
||||
/* encode the image */
|
||||
out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
|
||||
AVPacket pkt;
|
||||
av_init_packet(&pkt);
|
||||
#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0)
|
||||
int got_output = 0;
|
||||
pkt.data = NULL;
|
||||
pkt.size = 0;
|
||||
ret = avcodec_encode_video2(c, &pkt, picture, &got_output);
|
||||
if (ret < 0)
|
||||
;
|
||||
else if (got_output) {
|
||||
if (pkt.pts != (int64_t)AV_NOPTS_VALUE)
|
||||
pkt.pts = av_rescale_q(pkt.pts, c->time_base, video_st->time_base);
|
||||
if (pkt.dts != (int64_t)AV_NOPTS_VALUE)
|
||||
pkt.dts = av_rescale_q(pkt.dts, c->time_base, video_st->time_base);
|
||||
if (pkt.duration)
|
||||
pkt.duration = av_rescale_q(pkt.duration, c->time_base, video_st->time_base);
|
||||
pkt.stream_index= video_st->index;
|
||||
ret = av_write_frame(oc, &pkt);
|
||||
av_free_packet(&pkt);
|
||||
}
|
||||
else
|
||||
ret = OPENCV_NO_FRAMES_WRITTEN_CODE;
|
||||
#else
|
||||
int out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
|
||||
/* if zero size, it means the image was buffered */
|
||||
if (out_size > 0) {
|
||||
AVPacket pkt;
|
||||
av_init_packet(&pkt);
|
||||
|
||||
#if LIBAVFORMAT_BUILD > 4752
|
||||
if(c->coded_frame->pts != (int64_t)AV_NOPTS_VALUE)
|
||||
pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, video_st->time_base);
|
||||
@ -1292,9 +1325,8 @@ static int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st,
|
||||
|
||||
/* write the compressed frame in the media file */
|
||||
ret = av_write_frame(oc, &pkt);
|
||||
} else {
|
||||
ret = OPENCV_NO_FRAMES_WRITTEN_CODE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -1401,7 +1433,9 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int
|
||||
(PixelFormat)input_pix_fmt, width, height);
|
||||
}
|
||||
|
||||
picture->pts = frame_idx;
|
||||
ret = icv_av_write_frame_FFMPEG( oc, video_st, outbuf, outbuf_size, picture) >= 0;
|
||||
frame_idx++;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1713,6 +1747,7 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
||||
}
|
||||
frame_width = width;
|
||||
frame_height = height;
|
||||
frame_idx = 0;
|
||||
ok = true;
|
||||
|
||||
return true;
|
||||
|
@ -344,7 +344,7 @@ class AviMjpegStream
|
||||
{
|
||||
public:
|
||||
AviMjpegStream();
|
||||
//stores founded frames in m_frame_list which be accessed via getFrames
|
||||
//stores founded frames in m_frame_list which can be accessed via getFrames
|
||||
bool parseAvi(MjpegInputStream& in_str);
|
||||
//stores founded frames in in_frame_list. getFrames() would return empty list
|
||||
bool parseAvi(MjpegInputStream& in_str, frame_list& in_frame_list);
|
||||
@ -377,7 +377,7 @@ protected:
|
||||
bool m_is_indx_present;
|
||||
};
|
||||
|
||||
AviMjpegStream::AviMjpegStream(): m_stream_id(0), m_movi_end(0), m_width(0), m_height(0), m_fps(0), m_is_indx_present(false)
|
||||
AviMjpegStream::AviMjpegStream(): m_stream_id(0), m_movi_start(0), m_movi_end(0), m_width(0), m_height(0), m_fps(0), m_is_indx_present(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -248,6 +248,25 @@ public:
|
||||
writeBlock();
|
||||
}
|
||||
|
||||
void jflush(unsigned currval, int bitIdx)
|
||||
{
|
||||
uchar v;
|
||||
uchar* ptr = m_current;
|
||||
currval |= (1 << bitIdx)-1;
|
||||
while( bitIdx < 32 )
|
||||
{
|
||||
v = (uchar)(currval >> 24);
|
||||
*ptr++ = v;
|
||||
if( v == 255 )
|
||||
*ptr++ = 0;
|
||||
currval <<= 8;
|
||||
bitIdx += 8;
|
||||
}
|
||||
m_current = ptr;
|
||||
if( m_current >= m_end )
|
||||
writeBlock();
|
||||
}
|
||||
|
||||
static bool createEncodeHuffmanTable( const int* src, unsigned* table, int max_size )
|
||||
{
|
||||
int i, k;
|
||||
@ -1440,7 +1459,7 @@ void MotionJpegWriter::writeFrameData( const uchar* data, int step, int colorspa
|
||||
}
|
||||
|
||||
// Flush
|
||||
JPUT_BITS((unsigned)-1, bit_idx & 31);
|
||||
strm.jflush(currval, bit_idx);
|
||||
strm.jputShort( 0xFFD9 ); // EOI marker
|
||||
/*printf("total dct = %.1fms, total cvt = %.1fms\n",
|
||||
total_dct*1000./cv::getTickFrequency(),
|
||||
|
@ -94,160 +94,223 @@ typedef struct AVCodecTag {
|
||||
unsigned int tag;
|
||||
} AVCodecTag;
|
||||
|
||||
#if (LIBAVCODEC_VERSION_INT <= AV_VERSION_INT(54, 51, 100))
|
||||
#define AV_CODEC_ID_H264 CODEC_ID_H264
|
||||
#define AV_CODEC_ID_H263 CODEC_ID_H263
|
||||
#define AV_CODEC_ID_H263P CODEC_ID_H263P
|
||||
#define AV_CODEC_ID_H261 CODEC_ID_H261
|
||||
#define AV_CODEC_ID_MPEG4 CODEC_ID_MPEG4
|
||||
#define AV_CODEC_ID_MSMPEG4V3 CODEC_ID_MSMPEG4V3
|
||||
#define AV_CODEC_ID_MSMPEG4V2 CODEC_ID_MSMPEG4V2
|
||||
#define AV_CODEC_ID_MSMPEG4V1 CODEC_ID_MSMPEG4V1
|
||||
#define AV_CODEC_ID_WMV1 CODEC_ID_WMV1
|
||||
#define AV_CODEC_ID_WMV2 CODEC_ID_WMV1
|
||||
#define AV_CODEC_ID_DVVIDEO CODEC_ID_DVVIDEO
|
||||
#define AV_CODEC_ID_MPEG1VIDEO CODEC_ID_MPEG1VIDEO
|
||||
#define AV_CODEC_ID_MPEG2VIDEO CODEC_ID_MPEG2VIDEO
|
||||
#define AV_CODEC_ID_MJPEG CODEC_ID_MJPEG
|
||||
#define AV_CODEC_ID_LJPEG CODEC_ID_LJPEG
|
||||
#define AV_CODEC_ID_HUFFYUV CODEC_ID_HUFFYUV
|
||||
#define AV_CODEC_ID_FFVHUFF CODEC_ID_FFVHUFF
|
||||
#define AV_CODEC_ID_CYUV CODEC_ID_CYUV
|
||||
#define AV_CODEC_ID_RAWVIDEO CODEC_ID_RAWVIDEO
|
||||
#define AV_CODEC_ID_INDEO3 CODEC_ID_INDEO3
|
||||
#define AV_CODEC_ID_VP3 CODEC_ID_VP3
|
||||
#define AV_CODEC_ID_ASV1 CODEC_ID_ASV1
|
||||
#define AV_CODEC_ID_ASV2 CODEC_ID_ASV2
|
||||
#define AV_CODEC_ID_VCR1 CODEC_ID_VCR1
|
||||
#define AV_CODEC_ID_FFV1 CODEC_ID_FFV1
|
||||
#define AV_CODEC_ID_XAN_WC4 CODEC_ID_XAN_WC4
|
||||
#define AV_CODEC_ID_MSRLE CODEC_ID_MSRLE
|
||||
#define AV_CODEC_ID_MSVIDEO1 CODEC_ID_MSVIDEO1
|
||||
#define AV_CODEC_ID_CINEPAK CODEC_ID_CINEPAK
|
||||
#define AV_CODEC_ID_TRUEMOTION1 CODEC_ID_TRUEMOTION1
|
||||
#define AV_CODEC_ID_MSZH CODEC_ID_MSZH
|
||||
#define AV_CODEC_ID_ZLIB CODEC_ID_ZLIB
|
||||
#define AV_CODEC_ID_SNOW CODEC_ID_SNOW
|
||||
#define AV_CODEC_ID_4XM CODEC_ID_4XM
|
||||
#define AV_CODEC_ID_FLV1 CODEC_ID_FLV1
|
||||
#define AV_CODEC_ID_SVQ1 CODEC_ID_SVQ1
|
||||
#define AV_CODEC_ID_TSCC CODEC_ID_TSCC
|
||||
#define AV_CODEC_ID_ULTI CODEC_ID_ULTI
|
||||
#define AV_CODEC_ID_VIXL CODEC_ID_VIXL
|
||||
#define AV_CODEC_ID_QPEG CODEC_ID_QPEG
|
||||
#define AV_CODEC_ID_WMV3 CODEC_ID_WMV3
|
||||
#define AV_CODEC_ID_LOCO CODEC_ID_LOCO
|
||||
#define AV_CODEC_ID_THEORA CODEC_ID_THEORA
|
||||
#define AV_CODEC_ID_WNV CODEC_ID_WNV
|
||||
#define AV_CODEC_ID_AASC CODEC_ID_AASC
|
||||
#define AV_CODEC_ID_INDEO2 CODEC_ID_INDEO2
|
||||
#define AV_CODEC_ID_FRAPS CODEC_ID_FRAPS
|
||||
#define AV_CODEC_ID_TRUEMOTION2 CODEC_ID_TRUEMOTION2
|
||||
#define AV_CODEC_ID_FLASHSV CODEC_ID_FLASHSV
|
||||
#define AV_CODEC_ID_JPEGLS CODEC_ID_JPEGLS
|
||||
#define AV_CODEC_ID_VC1 CODEC_ID_VC1
|
||||
#define AV_CODEC_ID_CSCD CODEC_ID_CSCD
|
||||
#define AV_CODEC_ID_ZMBV CODEC_ID_ZMBV
|
||||
#define AV_CODEC_ID_KMVC CODEC_ID_KMVC
|
||||
#define AV_CODEC_ID_VP5 CODEC_ID_VP5
|
||||
#define AV_CODEC_ID_VP6 CODEC_ID_VP6
|
||||
#define AV_CODEC_ID_VP6F CODEC_ID_VP6F
|
||||
#define AV_CODEC_ID_JPEG2000 CODEC_ID_JPEG2000
|
||||
#define AV_CODEC_ID_VMNC CODEC_ID_VMNC
|
||||
#define AV_CODEC_ID_TARGA CODEC_ID_TARGA
|
||||
#define AV_CODEC_ID_NONE CODEC_ID_NONE
|
||||
#endif
|
||||
|
||||
const AVCodecTag codec_bmp_tags[] = {
|
||||
{ CODEC_ID_H264, MKTAG('H', '2', '6', '4') },
|
||||
{ CODEC_ID_H264, MKTAG('h', '2', '6', '4') },
|
||||
{ CODEC_ID_H264, MKTAG('X', '2', '6', '4') },
|
||||
{ CODEC_ID_H264, MKTAG('x', '2', '6', '4') },
|
||||
{ CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
|
||||
{ CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') },
|
||||
{ AV_CODEC_ID_H264, MKTAG('H', '2', '6', '4') },
|
||||
{ AV_CODEC_ID_H264, MKTAG('h', '2', '6', '4') },
|
||||
{ AV_CODEC_ID_H264, MKTAG('X', '2', '6', '4') },
|
||||
{ AV_CODEC_ID_H264, MKTAG('x', '2', '6', '4') },
|
||||
{ AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
|
||||
{ AV_CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') },
|
||||
|
||||
{ CODEC_ID_H263, MKTAG('H', '2', '6', '3') },
|
||||
{ CODEC_ID_H263P, MKTAG('H', '2', '6', '3') },
|
||||
{ CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* intel h263 */
|
||||
{ CODEC_ID_H261, MKTAG('H', '2', '6', '1') },
|
||||
{ AV_CODEC_ID_H263, MKTAG('H', '2', '6', '3') },
|
||||
{ AV_CODEC_ID_H263P, MKTAG('H', '2', '6', '3') },
|
||||
{ AV_CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* intel h263 */
|
||||
{ AV_CODEC_ID_H261, MKTAG('H', '2', '6', '1') },
|
||||
|
||||
/* added based on MPlayer */
|
||||
{ CODEC_ID_H263P, MKTAG('U', '2', '6', '3') },
|
||||
{ CODEC_ID_H263P, MKTAG('v', 'i', 'v', '1') },
|
||||
{ AV_CODEC_ID_H263P, MKTAG('U', '2', '6', '3') },
|
||||
{ AV_CODEC_ID_H263P, MKTAG('v', 'i', 'v', '1') },
|
||||
|
||||
{ CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
|
||||
{ CODEC_ID_MPEG4, MKTAG(0x04, 0, 0, 0) }, /* some broken avi use this */
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG(0x04, 0, 0, 0) }, /* some broken avi use this */
|
||||
|
||||
/* added based on MPlayer */
|
||||
{ CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') },
|
||||
{ CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') },
|
||||
|
||||
{ CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') },
|
||||
{ AV_CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') },
|
||||
|
||||
{ CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') }, /* default signature when using MSMPEG4 */
|
||||
{ CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
|
||||
{ AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') }, /* default signature when using MSMPEG4 */
|
||||
{ AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
|
||||
|
||||
/* added based on MPlayer */
|
||||
{ CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
|
||||
{ CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
|
||||
{ CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
|
||||
{ CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
|
||||
{ CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
|
||||
{ CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
|
||||
{ CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
|
||||
{ AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
|
||||
{ AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
|
||||
{ AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
|
||||
{ AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
|
||||
{ AV_CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
|
||||
{ AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
|
||||
{ AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
|
||||
|
||||
{ CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
|
||||
{ AV_CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
|
||||
|
||||
/* added based on MPlayer */
|
||||
{ CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
|
||||
{ AV_CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
|
||||
|
||||
{ CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
|
||||
{ AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
|
||||
|
||||
{ CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
|
||||
{ AV_CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
|
||||
|
||||
/* added based on MPlayer */
|
||||
{ CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
|
||||
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
|
||||
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
|
||||
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
|
||||
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
|
||||
{ CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
|
||||
{ CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') },
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') },
|
||||
{ CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
|
||||
{ CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
|
||||
{ CODEC_ID_MPEG1VIDEO, 0x10000001 },
|
||||
{ CODEC_ID_MPEG2VIDEO, 0x10000002 },
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') },
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') },
|
||||
{ CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
|
||||
{ CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
|
||||
{ CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
|
||||
{ CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */
|
||||
{ CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */
|
||||
{ CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
|
||||
{ CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') },
|
||||
{ CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') },
|
||||
{ CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
|
||||
{ CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') },
|
||||
{ CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
|
||||
{ CODEC_ID_RAWVIDEO, 0 },
|
||||
{ CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
|
||||
{ CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') },
|
||||
{ CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
|
||||
{ CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') },
|
||||
{ CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') },
|
||||
{ CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') },
|
||||
{ CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') },
|
||||
{ CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') },
|
||||
{ CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
|
||||
{ CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
|
||||
{ CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
|
||||
{ CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
|
||||
{ CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
|
||||
{ CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
|
||||
{ CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
|
||||
{ CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
|
||||
{ CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
|
||||
{ CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
|
||||
{ CODEC_ID_MSRLE, MKTAG(0x1, 0x0, 0x0, 0x0) },
|
||||
{ CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
|
||||
{ CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
|
||||
{ CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
|
||||
{ CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
|
||||
{ CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
|
||||
{ CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
|
||||
{ CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
|
||||
{ CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') },
|
||||
{ CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') },
|
||||
{ CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') },
|
||||
{ CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') },
|
||||
{ CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') },
|
||||
{ CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') },
|
||||
{ CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
|
||||
{ CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') },
|
||||
{ CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') },
|
||||
{ CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') },
|
||||
{ CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') },
|
||||
{ CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') },
|
||||
{ CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') },
|
||||
{ CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') },
|
||||
{ CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') },
|
||||
{ CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') },
|
||||
{ AV_CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
|
||||
{ AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
|
||||
{ AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
|
||||
{ AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
|
||||
{ AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
|
||||
{ AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
|
||||
{ AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
|
||||
{ AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') },
|
||||
{ AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') },
|
||||
{ AV_CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
|
||||
{ AV_CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
|
||||
{ AV_CODEC_ID_MPEG1VIDEO, 0x10000001 },
|
||||
{ AV_CODEC_ID_MPEG2VIDEO, 0x10000002 },
|
||||
{ AV_CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') },
|
||||
{ AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') },
|
||||
{ AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
|
||||
{ AV_CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
|
||||
{ AV_CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
|
||||
{ AV_CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */
|
||||
{ AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */
|
||||
{ AV_CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
|
||||
{ AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') },
|
||||
{ AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') },
|
||||
{ AV_CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
|
||||
{ AV_CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') },
|
||||
{ AV_CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
|
||||
{ AV_CODEC_ID_RAWVIDEO, 0 },
|
||||
{ AV_CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
|
||||
{ AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') },
|
||||
{ AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
|
||||
{ AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') },
|
||||
{ AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') },
|
||||
{ AV_CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') },
|
||||
{ AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') },
|
||||
{ AV_CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') },
|
||||
{ AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
|
||||
{ AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
|
||||
{ AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
|
||||
{ AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
|
||||
{ AV_CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
|
||||
{ AV_CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
|
||||
{ AV_CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
|
||||
{ AV_CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
|
||||
{ AV_CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
|
||||
{ AV_CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
|
||||
{ AV_CODEC_ID_MSRLE, MKTAG(0x1, 0x0, 0x0, 0x0) },
|
||||
{ AV_CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
|
||||
{ AV_CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
|
||||
{ AV_CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
|
||||
{ AV_CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
|
||||
{ AV_CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
|
||||
{ AV_CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
|
||||
{ AV_CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
|
||||
{ AV_CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') },
|
||||
{ AV_CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') },
|
||||
{ AV_CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') },
|
||||
{ AV_CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') },
|
||||
{ AV_CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') },
|
||||
{ AV_CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
|
||||
{ AV_CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') },
|
||||
{ AV_CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') },
|
||||
{ AV_CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') },
|
||||
{ AV_CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') },
|
||||
{ AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') },
|
||||
{ AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') },
|
||||
{ AV_CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') },
|
||||
{ AV_CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') },
|
||||
{ AV_CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') },
|
||||
#if LIBAVCODEC_VERSION_INT>0x000409
|
||||
{ CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') },
|
||||
{ CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') },
|
||||
{ CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') },
|
||||
{ CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') },
|
||||
{ CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') },
|
||||
{ AV_CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') },
|
||||
{ AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') },
|
||||
{ AV_CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') },
|
||||
{ AV_CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') },
|
||||
{ AV_CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') },
|
||||
#endif
|
||||
#if LIBAVCODEC_VERSION_INT>((50<<16)+(1<<8)+0)
|
||||
{ CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') },
|
||||
{ CODEC_ID_JPEGLS,MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */
|
||||
{ CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') },
|
||||
{ CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') },
|
||||
{ CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') },
|
||||
{ CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') },
|
||||
{ CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') },
|
||||
{ AV_CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') },
|
||||
{ AV_CODEC_ID_JPEGLS,MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */
|
||||
{ AV_CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') },
|
||||
{ AV_CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') },
|
||||
{ AV_CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') },
|
||||
{ AV_CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') },
|
||||
{ AV_CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') },
|
||||
#endif
|
||||
#if LIBAVCODEC_VERSION_INT>((51<<16)+(11<<8)+0)
|
||||
{ CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
|
||||
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
|
||||
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
|
||||
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
|
||||
{ CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') },
|
||||
{ CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') },
|
||||
{ CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') },
|
||||
{ AV_CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
|
||||
{ AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
|
||||
{ AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
|
||||
{ AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
|
||||
{ AV_CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') },
|
||||
{ AV_CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') },
|
||||
{ AV_CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') },
|
||||
#endif
|
||||
#if LIBAVCODEC_VERSION_INT>=((51<<16)+(49<<8)+0)
|
||||
// this tag seems not to exist in older versions of FFMPEG
|
||||
{ CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
|
||||
{ AV_CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
|
||||
#endif
|
||||
{ CODEC_ID_NONE, 0 },
|
||||
{ AV_CODEC_ID_NONE, 0 },
|
||||
};
|
||||
|
@ -132,6 +132,7 @@ public:
|
||||
writer << img;
|
||||
}
|
||||
|
||||
writer.release();
|
||||
if (!created) created = true;
|
||||
else remove(filename.c_str());
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ void cv::viz::Viz3d::VizImpl::TimerCallback::Execute(vtkObject* caller, unsigned
|
||||
|
||||
void cv::viz::Viz3d::VizImpl::ExitCallback::Execute(vtkObject*, unsigned long event_id, void*)
|
||||
{
|
||||
if (event_id == vtkCommand::ExitEvent)
|
||||
if (event_id == vtkCommand::ExitEvent && viz->interactor_)
|
||||
{
|
||||
viz->interactor_->TerminateApp();
|
||||
viz->interactor_ = 0;
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.opencv.engine"
|
||||
package="org.opencv.engine3"
|
||||
android:versionCode="300@ANDROID_PLATFORM_VERSION_CODE@"
|
||||
android:versionName="3.00" >
|
||||
|
||||
@ -13,12 +13,12 @@
|
||||
|
||||
<service android:exported="true" android:name="OpenCVEngineService" android:process=":OpenCVEngineProcess">
|
||||
<intent-filter>
|
||||
<action android:name="org.opencv.engine.BIND"></action>
|
||||
<action android:name="org.opencv.engine3.BIND"></action>
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<activity
|
||||
android:name="org.opencv.engine.manager.ManagerActivity"
|
||||
android:name="org.opencv.engine3.manager.ManagerActivity"
|
||||
android:label="@string/app_name"
|
||||
android:screenOrientation="portrait">
|
||||
<intent-filter>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="OpenCV Manager" default="help">
|
||||
<project name="OpenCV3 Manager" default="help">
|
||||
|
||||
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||
It contains the path to the SDK. It should *NOT* be checked into
|
||||
|
@ -3,23 +3,23 @@
|
||||
#include <jni.h>
|
||||
#include <string>
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_HardwareDetector_GetCpuID(JNIEnv* , jclass)
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine3_HardwareDetector_GetCpuID(JNIEnv* , jclass)
|
||||
{
|
||||
return GetCpuID();
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_HardwareDetector_GetPlatformName(JNIEnv* env, jclass)
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine3_HardwareDetector_GetPlatformName(JNIEnv* env, jclass)
|
||||
{
|
||||
std::string hardware_name = GetPlatformName();
|
||||
return env->NewStringUTF(hardware_name.c_str());
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_HardwareDetector_GetProcessorCount(JNIEnv* , jclass)
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine3_HardwareDetector_GetProcessorCount(JNIEnv* , jclass)
|
||||
{
|
||||
return GetProcessorCount();
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_HardwareDetector_DetectKnownPlatforms(JNIEnv* , jclass)
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine3_HardwareDetector_DetectKnownPlatforms(JNIEnv* , jclass)
|
||||
{
|
||||
return DetectKnownPlatforms();
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ extern "C" {
|
||||
* Method: GetCpuID
|
||||
* Signature: ()I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_HardwareDetector_GetCpuID
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine3_HardwareDetector_GetCpuID
|
||||
(JNIEnv *, jclass);
|
||||
|
||||
/*
|
||||
@ -22,7 +22,7 @@ JNIEXPORT jint JNICALL Java_org_opencv_engine_HardwareDetector_GetCpuID
|
||||
* Method: GetPlatformName
|
||||
* Signature: ()Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_HardwareDetector_GetPlatformName
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine3_HardwareDetector_GetPlatformName
|
||||
(JNIEnv *, jclass);
|
||||
|
||||
/*
|
||||
@ -30,7 +30,7 @@ JNIEXPORT jstring JNICALL Java_org_opencv_engine_HardwareDetector_GetPlatformNam
|
||||
* Method: GetProcessorCount
|
||||
* Signature: ()I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_HardwareDetector_GetProcessorCount
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine3_HardwareDetector_GetProcessorCount
|
||||
(JNIEnv *, jclass);
|
||||
|
||||
/*
|
||||
@ -38,7 +38,7 @@ JNIEXPORT jint JNICALL Java_org_opencv_engine_HardwareDetector_GetProcessorCount
|
||||
* Method: DetectKnownPlatforms
|
||||
* Signature: ()I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_HardwareDetector_DetectKnownPlatforms
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine3_HardwareDetector_DetectKnownPlatforms
|
||||
(JNIEnv *, jclass);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -15,7 +15,7 @@ using namespace android;
|
||||
sp<IBinder> OpenCVEngineBinder = NULL;
|
||||
IPackageManager* PackageManager = NULL;
|
||||
|
||||
JNIEXPORT jobject JNICALL Java_org_opencv_engine_BinderConnector_Connect(JNIEnv* env, jobject)
|
||||
JNIEXPORT jobject JNICALL Java_org_opencv_engine3_BinderConnector_Connect(JNIEnv* env, jobject)
|
||||
{
|
||||
LOGI("Creating new component");
|
||||
if (NULL != OpenCVEngineBinder.get())
|
||||
@ -30,7 +30,7 @@ JNIEXPORT jobject JNICALL Java_org_opencv_engine_BinderConnector_Connect(JNIEnv*
|
||||
return javaObjectForIBinder(env, OpenCVEngineBinder);
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_org_opencv_engine_BinderConnector_Init(JNIEnv* env, jobject , jobject market)
|
||||
JNIEXPORT jboolean JNICALL Java_org_opencv_engine3_BinderConnector_Init(JNIEnv* env, jobject , jobject market)
|
||||
{
|
||||
LOGD("Java_org_opencv_engine_BinderConnector_Init");
|
||||
|
||||
@ -58,7 +58,7 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_engine_BinderConnector_Init(JNIEnv* e
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine_BinderConnector_Final(JNIEnv *, jobject)
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine3_BinderConnector_Final(JNIEnv *, jobject)
|
||||
{
|
||||
LOGD("Java_org_opencv_engine_BinderConnector_Final");
|
||||
|
||||
|
@ -12,7 +12,7 @@ extern "C" {
|
||||
* Method: Connect
|
||||
* Signature: ()Landroid/os/IBinder;
|
||||
*/
|
||||
JNIEXPORT jobject JNICALL Java_org_opencv_engine_BinderConnector_Connect
|
||||
JNIEXPORT jobject JNICALL Java_org_opencv_engine3_BinderConnector_Connect
|
||||
(JNIEnv *, jobject);
|
||||
|
||||
/*
|
||||
@ -20,7 +20,7 @@ JNIEXPORT jobject JNICALL Java_org_opencv_engine_BinderConnector_Connect
|
||||
* Method: Init
|
||||
* Signature: (Lorg/opencv/engine/MarketConnector;)Z
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL Java_org_opencv_engine_BinderConnector_Init
|
||||
JNIEXPORT jboolean JNICALL Java_org_opencv_engine3_BinderConnector_Init
|
||||
(JNIEnv *, jobject, jobject);
|
||||
|
||||
/*
|
||||
@ -28,7 +28,7 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_engine_BinderConnector_Init
|
||||
* Method: Final
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine_BinderConnector_Final
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine3_BinderConnector_Final
|
||||
(JNIEnv *, jobject);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -3,7 +3,7 @@
|
||||
#include <utils/Log.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
JNIEXPORT jlong JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_open
|
||||
JNIEXPORT jlong JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_open
|
||||
(JNIEnv * env, jobject, jstring str)
|
||||
{
|
||||
const char* infoLibPath = env->GetStringUTFChars(str, NULL);
|
||||
@ -21,7 +21,7 @@ JNIEXPORT jlong JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_open
|
||||
return (jlong)handle;
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getPackageName
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_getPackageName
|
||||
(JNIEnv* env, jobject, jlong handle)
|
||||
{
|
||||
InfoFunctionType info_func;
|
||||
@ -41,7 +41,7 @@ JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getPackageNam
|
||||
return env->NewStringUTF(result);
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getLibraryList
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_getLibraryList
|
||||
(JNIEnv* env, jobject, jlong handle)
|
||||
{
|
||||
InfoFunctionType info_func;
|
||||
@ -61,7 +61,7 @@ JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getLibraryLis
|
||||
return env->NewStringUTF(result);
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getVersionName
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_getVersionName
|
||||
(JNIEnv* env, jobject, jlong handle)
|
||||
{
|
||||
InfoFunctionType info_func;
|
||||
@ -81,7 +81,7 @@ JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getVersionNam
|
||||
return env->NewStringUTF(result);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_close
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_close
|
||||
(JNIEnv*, jobject, jlong handle)
|
||||
{
|
||||
dlclose((void*)handle);
|
||||
|
@ -6,19 +6,19 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
JNIEXPORT jlong JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_open
|
||||
JNIEXPORT jlong JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_open
|
||||
(JNIEnv *, jobject, jstring);
|
||||
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getPackageName
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_getPackageName
|
||||
(JNIEnv *, jobject, jlong);
|
||||
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getLibraryList
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_getLibraryList
|
||||
(JNIEnv *, jobject, jlong);
|
||||
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getVersionName
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_getVersionName
|
||||
(JNIEnv *, jobject, jlong);
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_close
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine3_OpenCVLibraryInfo_close
|
||||
(JNIEnv *, jobject, jlong);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -27,7 +27,7 @@ map<int, string> PackageInfo::InitPlatformNameMap()
|
||||
|
||||
const map<int, string> PackageInfo::PlatformNameMap = InitPlatformNameMap();
|
||||
const string PackageInfo::BasePackageName = "org.opencv.lib";
|
||||
const string DEFAULT_ENGINE_INSTALL_PATH = "/data/data/org.opencv.engine";
|
||||
const string DEFAULT_ENGINE_INSTALL_PATH = "/data/data/org.opencv.engine3";
|
||||
|
||||
inline string JoinARMFeatures(int cpu_id)
|
||||
{
|
||||
|
@ -13,9 +13,9 @@
|
||||
#define LIB_OPENCV_INFO_NAME "libopencv_info.so"
|
||||
|
||||
// OpenCV Manager package name
|
||||
#define OPENCV_ENGINE_PACKAGE "org.opencv.engine"
|
||||
#define OPENCV_ENGINE_PACKAGE "org.opencv.engine3"
|
||||
// Class name of OpenCV engine binder object. Is needned for connection to service
|
||||
#define OPECV_ENGINE_CLASSNAME "org.opencv.engine.OpenCVEngineInterface"
|
||||
#define OPECV_ENGINE_CLASSNAME "org.opencv.engine3.OpenCVEngineInterface"
|
||||
|
||||
typedef const char* (*InfoFunctionType)();
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">OpenCV Manager</string>
|
||||
</resources>
|
||||
<string name="app_name">OpenCV3 Manager</string>
|
||||
</resources>
|
||||
|
@ -1,4 +1,4 @@
|
||||
package org.opencv.engine;
|
||||
package org.opencv.engine3;
|
||||
|
||||
import android.os.IBinder;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package org.opencv.engine;
|
||||
package org.opencv.engine3;
|
||||
|
||||
public class HardwareDetector
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
package org.opencv.engine;
|
||||
package org.opencv.engine3;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
@ -99,7 +99,7 @@ public class MarketConnector
|
||||
List<PackageInfo> AllPackages = mContext.getPackageManager().getInstalledPackages(PackageManager.GET_CONFIGURATIONS);
|
||||
List<PackageInfo> OpenCVPackages = new ArrayList<PackageInfo>();
|
||||
try {
|
||||
OpenCVPackages.add(mContext.getPackageManager().getPackageInfo("org.opencv.engine", PackageManager.GET_CONFIGURATIONS));
|
||||
OpenCVPackages.add(mContext.getPackageManager().getPackageInfo("org.opencv.engine3", PackageManager.GET_CONFIGURATIONS));
|
||||
} catch (NameNotFoundException e) {
|
||||
Log.e(TAG, "OpenCV Manager package info was not found!");
|
||||
e.printStackTrace();
|
@ -1,4 +1,4 @@
|
||||
package org.opencv.engine;
|
||||
package org.opencv.engine3;
|
||||
|
||||
/**
|
||||
* Class provides Java interface to OpenCV Engine Service. Is synchronious with native OpenCVEngine class.
|
@ -1,4 +1,4 @@
|
||||
package org.opencv.engine;
|
||||
package org.opencv.engine3;
|
||||
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
@ -1,4 +1,4 @@
|
||||
package org.opencv.engine;
|
||||
package org.opencv.engine3;
|
||||
|
||||
public class OpenCVLibraryInfo {
|
||||
public OpenCVLibraryInfo(String packagePath) {
|
@ -1,15 +1,15 @@
|
||||
package org.opencv.engine.manager;
|
||||
package org.opencv.engine3.manager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import org.opencv.engine.HardwareDetector;
|
||||
import org.opencv.engine.MarketConnector;
|
||||
import org.opencv.engine.OpenCVEngineInterface;
|
||||
import org.opencv.engine.OpenCVEngineService;
|
||||
import org.opencv.engine.OpenCVLibraryInfo;
|
||||
import org.opencv.engine.R;
|
||||
import org.opencv.engine3.HardwareDetector;
|
||||
import org.opencv.engine3.MarketConnector;
|
||||
import org.opencv.engine3.OpenCVEngineInterface;
|
||||
import org.opencv.engine3.OpenCVEngineService;
|
||||
import org.opencv.engine3.OpenCVLibraryInfo;
|
||||
import org.opencv.engine3.R;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
@ -161,7 +161,7 @@ public class ManagerActivity extends Activity
|
||||
mUpdateEngineButton.setOnClickListener(new OnClickListener() {
|
||||
|
||||
public void onClick(View v) {
|
||||
if (!mMarket.InstallAppFromMarket("org.opencv.engine"))
|
||||
if (!mMarket.InstallAppFromMarket("org.opencv.engine3"))
|
||||
{
|
||||
Toast toast = Toast.makeText(getApplicationContext(), "Google Play is not avaliable", Toast.LENGTH_SHORT);
|
||||
toast.show();
|
||||
@ -207,7 +207,7 @@ public class ManagerActivity extends Activity
|
||||
|
||||
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
|
||||
//if (!mListViewItems.get((int) id).get("Name").equals("Built-in OpenCV library"));
|
||||
if (!mInstalledPackageInfo[(int) id].packageName.equals("org.opencv.engine"))
|
||||
if (!mInstalledPackageInfo[(int) id].packageName.equals("org.opencv.engine3"))
|
||||
{
|
||||
mInstalledPackageView.setTag(Integer.valueOf((int)id));
|
||||
mActionDialog.show();
|
||||
@ -221,7 +221,7 @@ public class ManagerActivity extends Activity
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
Log.d("OpenCVManager/Receiver", "Broadcast message " + intent.getAction() + " receiver");
|
||||
Log.d("OpenCVManager/Receiver", "Filling package list on broadcast message");
|
||||
if (!bindService(new Intent("org.opencv.engine.BIND"),
|
||||
if (!bindService(new Intent("org.opencv.engine3.BIND"),
|
||||
new OpenCVEngineServiceConnection(), Context.BIND_AUTO_CREATE))
|
||||
{
|
||||
TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue);
|
||||
@ -350,7 +350,7 @@ public class ManagerActivity extends Activity
|
||||
else
|
||||
NativeLibDir = "/data/data/" + mInstalledPackageInfo[i].packageName + "/lib";
|
||||
|
||||
if (PackageName.equals("org.opencv.engine"))
|
||||
if (PackageName.equals("org.opencv.engine3"))
|
||||
{
|
||||
OpenCVLibraryInfo NativeInfo = new OpenCVLibraryInfo(NativeLibDir);
|
||||
if (NativeInfo.status())
|
@ -1,4 +1,4 @@
|
||||
package org.opencv.engine.manager;
|
||||
package org.opencv.engine3.manager;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.opencv.engine.test"
|
||||
package="org.opencv.engine3.test"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
<instrumentation
|
||||
android:name="android.test.InstrumentationTestRunner"
|
||||
android:targetPackage="org.opencv.engine" />
|
||||
android:targetPackage="org.opencv.engine3" />
|
||||
|
||||
<application
|
||||
android:icon="@drawable/ic_launcher"
|
||||
@ -17,4 +17,4 @@
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
</manifest>
|
||||
|
@ -1,7 +1,7 @@
|
||||
package org.opencv.engine.test;
|
||||
package org.opencv.engine3.test;
|
||||
|
||||
import org.opencv.engine.OpenCVEngineInterface;
|
||||
import org.opencv.engine.OpenCVEngineService;
|
||||
import org.opencv.engine3.OpenCVEngineInterface;
|
||||
import org.opencv.engine3.OpenCVEngineService;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.IBinder;
|
||||
@ -18,7 +18,7 @@ public class EngineInterfaceTest extends ServiceTestCase<OpenCVEngineService>
|
||||
|
||||
public void testVersion() throws RemoteException
|
||||
{
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine.BIND"));
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine3.BIND"));
|
||||
assertNotNull(ServiceBinder);
|
||||
OpenCVEngineInterface ServiceObj = OpenCVEngineInterface.Stub.asInterface(ServiceBinder);
|
||||
assertNotNull(ServiceObj);
|
||||
@ -28,7 +28,7 @@ public class EngineInterfaceTest extends ServiceTestCase<OpenCVEngineService>
|
||||
|
||||
public void testInstallVersion() throws RemoteException
|
||||
{
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine"));
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine3"));
|
||||
assertNotNull(ServiceBinder);
|
||||
OpenCVEngineInterface ServiceObj = OpenCVEngineInterface.Stub.asInterface(ServiceBinder);
|
||||
assertNotNull(ServiceObj);
|
||||
@ -37,7 +37,7 @@ public class EngineInterfaceTest extends ServiceTestCase<OpenCVEngineService>
|
||||
|
||||
public void testGetPathForExistVersion() throws RemoteException
|
||||
{
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine"));
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine3"));
|
||||
assertNotNull(ServiceBinder);
|
||||
OpenCVEngineInterface ServiceObj = OpenCVEngineInterface.Stub.asInterface(ServiceBinder);
|
||||
assertNotNull(ServiceObj);
|
||||
@ -46,7 +46,7 @@ public class EngineInterfaceTest extends ServiceTestCase<OpenCVEngineService>
|
||||
|
||||
public void testGetPathForUnExistVersion() throws RemoteException
|
||||
{
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine"));
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine3"));
|
||||
assertNotNull(ServiceBinder);
|
||||
OpenCVEngineInterface ServiceObj = OpenCVEngineInterface.Stub.asInterface(ServiceBinder);
|
||||
assertNotNull(ServiceObj);
|
||||
@ -55,7 +55,7 @@ public class EngineInterfaceTest extends ServiceTestCase<OpenCVEngineService>
|
||||
|
||||
public void testInstallAndGetVersion() throws RemoteException
|
||||
{
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine"));
|
||||
IBinder ServiceBinder = bindService(new Intent("org.opencv.engine3"));
|
||||
assertNotNull(ServiceBinder);
|
||||
OpenCVEngineInterface ServiceObj = OpenCVEngineInterface.Stub.asInterface(ServiceBinder);
|
||||
assertNotNull(ServiceObj);
|
28
samples/cpp/example_cmake/CMakeLists.txt
Normal file
28
samples/cpp/example_cmake/CMakeLists.txt
Normal file
@ -0,0 +1,28 @@
|
||||
# cmake needs this line
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
# Define project name
|
||||
project(opencv_example_project)
|
||||
|
||||
# Find OpenCV, you may need to set OpenCV_DIR variable
|
||||
# to the absolute path to the directory containing OpenCVConfig.cmake file
|
||||
# via the command line or GUI
|
||||
find_package(OpenCV REQUIRED)
|
||||
|
||||
# If the package has been found, several variables will
|
||||
# be set, you can find the full list with descriptions
|
||||
# in the OpenCVConfig.cmake file.
|
||||
# Print some message showing some of them
|
||||
message(STATUS "OpenCV library status:")
|
||||
message(STATUS " version: ${OpenCV_VERSION}")
|
||||
message(STATUS " libraries: ${OpenCV_LIBS}")
|
||||
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
|
||||
|
||||
# Add OpenCV headers location to your include paths
|
||||
include_directories(${OpenCV_INCLUDE_DIRS})
|
||||
|
||||
# Declare the executable target built from your sources
|
||||
add_executable(opencv_example example.cpp)
|
||||
|
||||
# Link your application with OpenCV libraries
|
||||
target_link_libraries(opencv_example ${OpenCV_LIBS})
|
50
samples/cpp/example_cmake/example.cpp
Normal file
50
samples/cpp/example_cmake/example.cpp
Normal file
@ -0,0 +1,50 @@
|
||||
#include "opencv2/core.hpp"
|
||||
#include "opencv2/imgproc.hpp"
|
||||
#include "opencv2/highgui.hpp"
|
||||
#include "opencv2/videoio.hpp"
|
||||
#include <iostream>
|
||||
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
void drawText(Mat & image);
|
||||
|
||||
int main()
|
||||
{
|
||||
cout << "Built with OpenCV " << CV_VERSION << endl;
|
||||
Mat image;
|
||||
VideoCapture capture;
|
||||
capture.open(0);
|
||||
if(capture.isOpened())
|
||||
{
|
||||
cout << "Capture is opened" << endl;
|
||||
for(;;)
|
||||
{
|
||||
capture >> image;
|
||||
if(image.empty())
|
||||
break;
|
||||
drawText(image);
|
||||
imshow("Sample", image);
|
||||
if(waitKey(10) >= 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cout << "No capture" << endl;
|
||||
image = Mat::zeros(480, 640, CV_8UC1);
|
||||
drawText(image);
|
||||
imshow("Sample", image);
|
||||
waitKey(0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void drawText(Mat & image)
|
||||
{
|
||||
putText(image, "Hello OpenCV",
|
||||
Point(20, 50),
|
||||
FONT_HERSHEY_COMPLEX, 1, // font face and scale
|
||||
Scalar(255, 255, 255), // white
|
||||
1, LINE_AA); // line thickness and type
|
||||
}
|
@ -27,8 +27,13 @@ void thresh_callback(int, void* );
|
||||
*/
|
||||
int main( int, char** argv )
|
||||
{
|
||||
/// Load source image and convert it to gray
|
||||
src = imread( argv[1], 1 );
|
||||
/// Load source image
|
||||
src = imread(argv[1]);
|
||||
if (src.empty())
|
||||
{
|
||||
cerr << "No image supplied ..." << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/// Convert image to gray and blur it
|
||||
cvtColor( src, src_gray, COLOR_BGR2GRAY );
|
||||
|
@ -69,7 +69,8 @@ int main(int argc, const char* argv[])
|
||||
{
|
||||
std::cout << "Open CUDA Writer" << std::endl;
|
||||
|
||||
d_writer = cv::cudacodec::createVideoWriter("output_gpu.avi", frame.size(), FPS);
|
||||
const cv::String outputFilename = "output_gpu.avi";
|
||||
d_writer = cv::cudacodec::createVideoWriter(outputFilename, frame.size(), FPS);
|
||||
}
|
||||
|
||||
d_frame.upload(frame);
|
||||
|
Loading…
x
Reference in New Issue
Block a user