Commit 769512db authored by ozantonkal's avatar ozantonkal

move image copying structure to viz3d_impl: ConvertToVtkImage

parent 952029a4
......@@ -155,9 +155,6 @@ namespace cv
ImageOverlayWidget(const Mat &image, const Rect &rect);
void setImage(const Mat &image);
private:
struct CopyImpl;
};
class CV_EXPORTS Image3DWidget : public Widget3D
......@@ -167,9 +164,6 @@ namespace cv
Image3DWidget(const Vec3f &position, const Vec3f &normal, const Vec3f &up_vector, const Mat &image, const Size &size);
void setImage(const Mat &image);
private:
struct CopyImpl;
};
class CV_EXPORTS CameraPositionWidget : public Widget3D
......@@ -181,8 +175,6 @@ namespace cv
CameraPositionWidget(const Vec2f &fov, double scale = 1.0, const Color &color = Color::white());
CameraPositionWidget(const Matx33f &K, const Mat &img, double scale = 1.0);
private:
struct CopyImpl;
};
class CV_EXPORTS TrajectoryWidget : public Widget3D
......
This diff is collapsed.
......@@ -410,6 +410,63 @@ namespace cv
inline Vec3d vtkpoint(const Point3f& point) { return Vec3d(point.x, point.y, point.z); }
template<typename _Tp> inline _Tp normalized(const _Tp& v) { return v * 1/cv::norm(v); }
struct ConvertToVtkImage
{
struct Impl
{
static void copyImageMultiChannel(const Mat &image, vtkSmartPointer<vtkImageData> output)
{
int i_chs = image.channels();
for (int i = 0; i < image.rows; ++i)
{
const unsigned char * irows = image.ptr<unsigned char>(i);
for (int j = 0; j < image.cols; ++j, irows += i_chs)
{
unsigned char * vrows = static_cast<unsigned char *>(output->GetScalarPointer(j,i,0));
memcpy(vrows, irows, i_chs);
std::swap(vrows[0], vrows[2]); // BGR -> RGB
}
}
output->Modified();
}
static void copyImageSingleChannel(const Mat &image, vtkSmartPointer<vtkImageData> output)
{
for (int i = 0; i < image.rows; ++i)
{
const unsigned char * irows = image.ptr<unsigned char>(i);
for (int j = 0; j < image.cols; ++j, ++irows)
{
unsigned char * vrows = static_cast<unsigned char *>(output->GetScalarPointer(j,i,0));
*vrows = *irows;
}
}
output->Modified();
}
};
static void convert(const Mat &image, vtkSmartPointer<vtkImageData> output)
{
// Create the vtk image
output->SetDimensions(image.cols, image.rows, 1);
output->SetNumberOfScalarComponents(image.channels());
output->SetScalarTypeToUnsignedChar();
output->AllocateScalars();
int i_chs = image.channels();
if (i_chs > 1)
{
// Multi channel images are handled differently because of BGR <-> RGB
Impl::copyImageMultiChannel(image, output);
}
else
{
Impl::copyImageSingleChannel(image, output);
}
}
};
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment