--- Begin Message ---
Package: libcv0.9.7-0
Version: 0.9.7-4
Severity: normal
Tags: patch
When working with a matrix with size > 3x3 (e.g. 4x4), the result of
cvTranspose is incorrect. This has been fixed upstream. But I believe
the patch should be backported at the time being.
-- System Information:
Debian Release: testing/unstable
APT prefers testing
APT policy: (500, 'testing')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.17-2-686
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Versions of packages libcv0.9.7-0 depends on:
ii libc6 2.3.6.ds1-4 GNU C Library: Shared libraries
ii libgcc1 1:4.1.1-13 GCC support library
ii libstdc++6 4.1.1-13 The GNU Standard C++ Library v3
libcv0.9.7-0 recommends no packages.
-- debconf-show failed
--- opencv-0.9.7/cxcore/src/cxmatrix.cpp 2005-06-10 17:56:42.000000000 +0800
+++ opencv-0.9.7.new/cxcore/src/cxmatrix.cpp 2006-09-22 17:12:23.000000000 +0800
@@ -54,7 +54,7 @@ cvSetIdentity( CvArr* array, CvScalar va
CvMat stub, *mat = (CvMat*)array;
CvSize size;
- int i, len, step;
+ int i, k, len, step;
int type, pix_size;
uchar* data = 0;
double buf[4];
@@ -89,24 +89,33 @@ cvSetIdentity( CvArr* array, CvScalar va
if( type == CV_32FC1 )
{
- *((float*)buf) = (float)value.val[0];
+ float val = (float)value.val[0];
+ float* _data = (float*)data;
+ step /= sizeof(_data[0]);
+ len *= step;
- for( i = 0; i < len; i++, (char*&)data += step )
- *((float*)data) = *((float*)buf);
+ for( i = 0; i < len; i += step )
+ _data[i] = val;
}
else if( type == CV_64FC1 )
{
- buf[0] = value.val[0];
-
- for( i = 0; i < len; i++, (char*&)data += step )
- *((double*)data) = buf[0];
+ double val = value.val[0];
+ double* _data = (double*)data;
+ step /= sizeof(_data[0]);
+ len *= step;
+
+ for( i = 0; i < len; i += step )
+ _data[i] = val;
}
else
{
+ uchar* val_ptr = (uchar*)buf;
cvScalarToRawData( &value, buf, type, 0 );
-
- for( i = 0; i < len; i++, (char*&)data += step )
- memcpy( data, buf, pix_size );
+ len *= step;
+
+ for( i = 0; i < len; i += step )
+ for( k = 0; k < pix_size; k++ )
+ data[i+k] = val_ptr[k];
}
__END__;
@@ -169,200 +178,215 @@ cvTrace( const CvArr* array )
/////////////////// macros for inplace transposition of square matrix ////////////////////
-#define ICV_DEF_TRANSP_INP_CASE_C1( arrtype, arr, step, len ) \
-{ \
- arrtype* arr1 = arr; \
- \
- while( --len ) \
- { \
- (char*&)arr += step, arr1++; \
- arrtype* arr2 = arr; \
- arrtype* arr3 = arr1; \
- \
- do \
- { \
- arrtype t0 = arr2[0]; \
- arrtype t1 = arr3[0]; \
- arr2[0] = t1; \
- arr3[0] = t0; \
- \
- arr2++; \
- (char*&)arr3 += step; \
- } \
- while( arr2 != arr3 ); \
- } \
+#define ICV_DEF_TRANSP_INP_CASE_C1( \
+ arrtype, len ) \
+{ \
+ arrtype* arr1 = arr; \
+ step /= sizeof(arr[0]); \
+ \
+ while( --len ) \
+ { \
+ arr += step, arr1++; \
+ arrtype* arr2 = arr; \
+ arrtype* arr3 = arr1; \
+ \
+ do \
+ { \
+ arrtype t0 = arr2[0]; \
+ arrtype t1 = arr3[0]; \
+ arr2[0] = t1; \
+ arr3[0] = t0; \
+ \
+ arr2++; \
+ arr3 += step; \
+ } \
+ while( arr2 != arr3 ); \
+ } \
}
-#define ICV_DEF_TRANSP_INP_CASE_C3( arrtype, arr, step, len ) \
-{ \
- arrtype* arr1 = arr; \
- int y; \
- \
- for( y = 1; y < len; y++ ) \
- { \
- (char*&)arr += step, arr1 += 3; \
- arrtype* arr2 = arr; \
- arrtype* arr3 = arr1; \
- \
- for( ; arr2 != arr3; arr2 += 3, (char*&)arr3 += step ) \
- { \
- arrtype t0 = arr2[0]; \
- arrtype t1 = arr3[0]; \
- arr2[0] = t1; \
- arr3[0] = t0; \
- t0 = arr2[1]; \
- t1 = arr3[1]; \
- arr2[1] = t1; \
- arr3[1] = t0; \
- t0 = arr2[2]; \
- t1 = arr3[2]; \
- arr2[2] = t1; \
- arr3[2] = t0; \
- } \
- } \
+#define ICV_DEF_TRANSP_INP_CASE_C3( \
+ arrtype, len ) \
+{ \
+ arrtype* arr1 = arr; \
+ int y; \
+ step /= sizeof(arr[0]); \
+ \
+ for( y = 1; y < len; y++ ) \
+ { \
+ arr += step, arr1 += 3; \
+ arrtype* arr2 = arr; \
+ arrtype* arr3 = arr1; \
+ \
+ for( ; arr2!=arr3; arr2+=3, \
+ arr3+=step )\
+ { \
+ arrtype t0 = arr2[0]; \
+ arrtype t1 = arr3[0]; \
+ arr2[0] = t1; \
+ arr3[0] = t0; \
+ t0 = arr2[1]; \
+ t1 = arr3[1]; \
+ arr2[1] = t1; \
+ arr3[1] = t0; \
+ t0 = arr2[2]; \
+ t1 = arr3[2]; \
+ arr2[2] = t1; \
+ arr3[2] = t0; \
+ } \
+ } \
}
-#define ICV_DEF_TRANSP_INP_CASE_C4( arrtype, arr, step, len ) \
-{ \
- arrtype* arr1 = arr; \
- int y; \
- \
- for( y = 1; y < len; y++ ) \
- { \
- (char*&)arr += step, arr1 += 4; \
- arrtype* arr2 = arr; \
- arrtype* arr3 = arr1; \
- \
- for( ; arr2 != arr3; arr2 += 4, (char*&)arr3 += step ) \
- { \
- arrtype t0 = arr2[0]; \
- arrtype t1 = arr3[0]; \
- arr2[0] = t1; \
- arr3[0] = t0; \
- t0 = arr2[1]; \
- t1 = arr3[1]; \
- arr2[1] = t1; \
- arr3[1] = t0; \
- t0 = arr2[2]; \
- t1 = arr3[2]; \
- arr2[2] = t1; \
- arr3[2] = t0; \
- t0 = arr2[3]; \
- t1 = arr3[3]; \
- arr2[3] = t1; \
- arr3[3] = t0; \
- } \
- } \
+#define ICV_DEF_TRANSP_INP_CASE_C4( \
+ arrtype, len ) \
+{ \
+ arrtype* arr1 = arr; \
+ int y; \
+ step /= sizeof(arr[0]); \
+ \
+ for( y = 1; y < len; y++ ) \
+ { \
+ arr += step, arr1 += 4; \
+ arrtype* arr2 = arr; \
+ arrtype* arr3 = arr1; \
+ \
+ for( ; arr2!=arr3; arr2+=4, \
+ arr3+=step )\
+ { \
+ arrtype t0 = arr2[0]; \
+ arrtype t1 = arr3[0]; \
+ arr2[0] = t1; \
+ arr3[0] = t0; \
+ t0 = arr2[1]; \
+ t1 = arr3[1]; \
+ arr2[1] = t1; \
+ arr3[1] = t0; \
+ t0 = arr2[2]; \
+ t1 = arr3[2]; \
+ arr2[2] = t1; \
+ arr3[2] = t0; \
+ t0 = arr2[3]; \
+ t1 = arr3[3]; \
+ arr2[3] = t1; \
+ arr3[3] = t0; \
+ } \
+ } \
}
//////////////// macros for non-inplace transposition of rectangular matrix //////////////
-#define ICV_DEF_TRANSP_CASE_C1( arrtype, src, srcstep, \
- dst, dststep, size ) \
-{ \
- int x, y; \
- \
- for( y = 0; y <= size.height - 2; y += 2, (char*&)src += 2*srcstep, dst += 2 ) \
- { \
- const arrtype* src1 = (const arrtype*)((char*)src + srcstep); \
- uchar* dst1 = (uchar*)dst; \
- \
- for( x = 0; x <= size.width - 2; x += 2, dst1 += dststep ) \
- { \
- arrtype t0 = src[x]; \
- arrtype t1 = src1[x]; \
- ((arrtype*)dst1)[0] = t0; \
- ((arrtype*)dst1)[1] = t1; \
- \
- dst1 += dststep; \
- \
- t0 = src[x + 1]; \
- t1 = src1[x + 1]; \
- ((arrtype*)dst1)[0] = t0; \
- ((arrtype*)dst1)[1] = t1; \
- } \
- \
- if( x < size.width ) \
- { \
- arrtype t0 = src[x]; \
- arrtype t1 = src1[x]; \
- ((arrtype*)dst1)[0] = t0; \
- ((arrtype*)dst1)[1] = t1; \
- } \
- } \
- \
- if( y < size.height ) \
- { \
- uchar* dst1 = (uchar*)dst; \
- for( x = 0; x <= size.width - 2; x += 2, dst1 += 2*dststep ) \
- { \
- arrtype t0 = src[x]; \
- arrtype t1 = src[x + 1]; \
- ((arrtype*)dst1)[0] = t0; \
- ((arrtype*)(dst1 + dststep))[0] = t1; \
- } \
- \
- if( x < size.width ) \
- { \
- arrtype t0 = src[x]; \
- ((arrtype*)dst1)[0] = t0; \
- } \
- } \
+#define ICV_DEF_TRANSP_CASE_C1( arrtype ) \
+{ \
+ int x, y; \
+ srcstep /= sizeof(src[0]); \
+ dststep /= sizeof(dst[0]); \
+ \
+ for( y = 0; y <= size.height - 2; y += 2, \
+ src += 2*srcstep, dst += 2 ) \
+ { \
+ const arrtype* src1 = src + srcstep; \
+ arrtype* dst1 = dst; \
+ \
+ for( x = 0; x <= size.width - 2; \
+ x += 2, dst1 += dststep ) \
+ { \
+ arrtype t0 = src[x]; \
+ arrtype t1 = src1[x]; \
+ dst1[0] = t0; \
+ dst1[1] = t1; \
+ dst1 += dststep; \
+ \
+ t0 = src[x + 1]; \
+ t1 = src1[x + 1]; \
+ dst1[0] = t0; \
+ dst1[1] = t1; \
+ } \
+ \
+ if( x < size.width ) \
+ { \
+ arrtype t0 = src[x]; \
+ arrtype t1 = src1[x]; \
+ dst1[0] = t0; \
+ dst1[1] = t1; \
+ } \
+ } \
+ \
+ if( y < size.height ) \
+ { \
+ arrtype* dst1 = dst; \
+ for( x = 0; x <= size.width - 2; \
+ x += 2, dst1 += 2*dststep ) \
+ { \
+ arrtype t0 = src[x]; \
+ arrtype t1 = src[x + 1]; \
+ dst1[0] = t0; \
+ dst1[dststep] = t1; \
+ } \
+ \
+ if( x < size.width ) \
+ { \
+ arrtype t0 = src[x]; \
+ dst1[0] = t0; \
+ } \
+ } \
}
-#define ICV_DEF_TRANSP_CASE_C3( arrtype, src, srcstep, \
- dst, dststep, size ) \
-{ \
- size.width *= 3; \
- \
- for( ; size.height--; (char*&)src += srcstep, dst += 3 ) \
- { \
- int x; \
- arrtype* dst1 = dst; \
- \
- for( x = 0; x < size.width; x += 3, (char*&)dst1 += dststep ) \
- { \
- arrtype t0 = src[x]; \
- arrtype t1 = src[x + 1]; \
- arrtype t2 = src[x + 2]; \
- \
- dst1[0] = t0; \
- dst1[1] = t1; \
- dst1[2] = t2; \
- } \
- } \
+#define ICV_DEF_TRANSP_CASE_C3( arrtype ) \
+{ \
+ size.width *= 3; \
+ srcstep /= sizeof(src[0]); \
+ dststep /= sizeof(dst[0]); \
+ \
+ for( ; size.height--; src+=srcstep, dst+=3 )\
+ { \
+ int x; \
+ arrtype* dst1 = dst; \
+ \
+ for( x = 0; x < size.width; x += 3, \
+ dst1 += dststep ) \
+ { \
+ arrtype t0 = src[x]; \
+ arrtype t1 = src[x + 1]; \
+ arrtype t2 = src[x + 2]; \
+ \
+ dst1[0] = t0; \
+ dst1[1] = t1; \
+ dst1[2] = t2; \
+ } \
+ } \
}
-#define ICV_DEF_TRANSP_CASE_C4( arrtype, src, srcstep, \
- dst, dststep, size ) \
-{ \
- size.width *= 4; \
- \
- for( ; size.height--; (char*&)src += srcstep, dst += 4 ) \
- { \
- int x; \
- arrtype* dst1 = dst; \
- \
- for( x = 0; x < size.width; x += 4, (char*&)dst1 += dststep ) \
- { \
- arrtype t0 = src[x]; \
- arrtype t1 = src[x + 1]; \
- \
- dst1[0] = t0; \
- dst1[1] = t1; \
- \
- t0 = src[x + 2]; \
- t1 = src[x + 3]; \
- \
- dst1[2] = t0; \
- dst1[3] = t1; \
- } \
- } \
+#define ICV_DEF_TRANSP_CASE_C4( arrtype ) \
+{ \
+ size.width *= 4; \
+ srcstep /= sizeof(src[0]); \
+ dststep /= sizeof(dst[0]); \
+ \
+ for( ; size.height--; src+=srcstep, dst+=4 )\
+ { \
+ int x; \
+ arrtype* dst1 = dst; \
+ \
+ for( x = 0; x < size.width; x += 4, \
+ dst1 += dststep ) \
+ { \
+ arrtype t0 = src[x]; \
+ arrtype t1 = src[x + 1]; \
+ \
+ dst1[0] = t0; \
+ dst1[1] = t1; \
+ \
+ t0 = src[x + 2]; \
+ t1 = src[x + 3]; \
+ \
+ dst1[2] = t0; \
+ dst1[3] = t1; \
+ } \
+ } \
}
@@ -372,8 +396,7 @@ icvTranspose_##flavor( arrtype* arr, int
{ \
assert( size.width == size.height ); \
\
- ICV_DEF_TRANSP_INP_CASE_C##cn( arrtype, arr, \
- step, size.width ) \
+ ICV_DEF_TRANSP_INP_CASE_C##cn( arrtype, size.width ) \
\
return CV_OK; \
}
@@ -384,8 +407,7 @@ static CvStatus CV_STDCALL
icvTranspose_##flavor( const arrtype* src, int srcstep, \
arrtype* dst, int dststep, CvSize size )\
{ \
- ICV_DEF_TRANSP_CASE_C##cn( arrtype, src, srcstep, \
- dst, dststep, size ) \
+ ICV_DEF_TRANSP_CASE_C##cn( arrtype ); \
\
return CV_OK; \
}
--- End Message ---