added path from go image to opencv image and back.
This commit is contained in:
parent
71563c2b68
commit
5d538b4b5e
4 changed files with 114 additions and 4 deletions
|
|
@ -114,6 +114,39 @@ func (img *IplImage) Reshape(channels, rows, _type int) *Mat {
|
|||
return (*Mat)(n)
|
||||
}
|
||||
|
||||
/* Get1D return a specific element from a 1-dimensional matrix. */
|
||||
func (img *IplImage) Get1D(x int) Scalar {
|
||||
ret := C.cvGet1D(unsafe.Pointer(img), C.int(x))
|
||||
return Scalar(ret)
|
||||
}
|
||||
|
||||
/* Get2D return a specific element from a 2-dimensional matrix. */
|
||||
func (img *IplImage) Get2D(x, y int) Scalar {
|
||||
ret := C.cvGet2D(unsafe.Pointer(img), C.int(x), C.int(y))
|
||||
return Scalar(ret)
|
||||
}
|
||||
|
||||
/* Get3D return a specific element from a 3-dimensional matrix. */
|
||||
func (img *IplImage) Get3D(x, y, z int) Scalar {
|
||||
ret := C.cvGet3D(unsafe.Pointer(img), C.int(x), C.int(y), C.int(z))
|
||||
return Scalar(ret)
|
||||
}
|
||||
|
||||
/* Set1D sets a particular element in the image */
|
||||
func (img *IplImage) Set1D(x int, value Scalar) {
|
||||
C.cvSet1D(unsafe.Pointer(img), C.int(x), (C.CvScalar)(value))
|
||||
}
|
||||
|
||||
/* Set2D sets a particular element in the image */
|
||||
func (img *IplImage) Set2D(x, y int, value Scalar) {
|
||||
C.cvSet2D(unsafe.Pointer(img), C.int(x), C.int(y), (C.CvScalar)(value))
|
||||
}
|
||||
|
||||
/* Set3D sets a particular element in the image */
|
||||
func (img *IplImage) Set3D(x, y, z int, value Scalar) {
|
||||
C.cvSet3D(unsafe.Pointer(img), C.int(x), C.int(y), C.int(z), (C.CvScalar)(value))
|
||||
}
|
||||
|
||||
/* GetMat returns the matrix header for an image.*/
|
||||
func (img *IplImage) GetMat() *Mat {
|
||||
var null C.int
|
||||
|
|
@ -155,6 +188,11 @@ func (mat *Mat) InitHeader(rows, cols, type_ int, data unsafe.Pointer, step int)
|
|||
)
|
||||
}
|
||||
|
||||
/* SetData assigns user data to the matrix header. */
|
||||
func (mat *Mat) SetData(data unsafe.Pointer, step int) {
|
||||
C.cvSetData(unsafe.Pointer(mat), data, C.int(step))
|
||||
}
|
||||
|
||||
/* Releases CvMat header and deallocates matrix data
|
||||
(reference counting is used for data) */
|
||||
func (mat *Mat) Release() {
|
||||
|
|
@ -275,6 +313,21 @@ func (m *Mat) Get3D(x, y, z int) Scalar {
|
|||
return Scalar(ret)
|
||||
}
|
||||
|
||||
/* Set1D sets a particular element in them matrix */
|
||||
func (m *Mat) Set1D(x int, value Scalar) {
|
||||
C.cvSet1D(unsafe.Pointer(m), C.int(x), (C.CvScalar)(value))
|
||||
}
|
||||
|
||||
/* Set2D sets a particular element in them matrix */
|
||||
func (m *Mat) Set2D(x, y int, value Scalar) {
|
||||
C.cvSet2D(unsafe.Pointer(m), C.int(x), C.int(y), (C.CvScalar)(value))
|
||||
}
|
||||
|
||||
/* Set3D sets a particular element in them matrix */
|
||||
func (m *Mat) Set3D(x, y, z int, value Scalar) {
|
||||
C.cvSet3D(unsafe.Pointer(m), C.int(x), C.int(y), C.int(z), (C.CvScalar)(value))
|
||||
}
|
||||
|
||||
/* GetImage returns the image header for the matrix. */
|
||||
func (m *Mat) GetImage(channels int) *IplImage {
|
||||
tmp := CreateImage(m.Cols(), m.Rows(), m.Type(), channels)
|
||||
|
|
|
|||
|
|
@ -602,8 +602,8 @@ const (
|
|||
|
||||
type Scalar C.CvScalar
|
||||
|
||||
func NewScalar(b, g, r int) Scalar {
|
||||
rv := C.cvScalar(C.double(b), C.double(g), C.double(r), C.double(0))
|
||||
func NewScalar(b, g, r, a float64) Scalar {
|
||||
rv := C.cvScalar(C.double(b), C.double(g), C.double(r), C.double(a))
|
||||
return (Scalar)(rv)
|
||||
}
|
||||
|
||||
|
|
|
|||
57
opencv/goimage.go
Normal file
57
opencv/goimage.go
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
package opencv
|
||||
|
||||
import (
|
||||
"image"
|
||||
"image/color"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
/* DecodeImageMem decodes an image from an in memory byte buffer. */
|
||||
func DecodeImageMem(data []byte) *IplImage {
|
||||
buf := CreateMatHeader(1, len(data), CV_8U)
|
||||
buf.SetData(unsafe.Pointer(&data[0]), CV_AUTOSTEP)
|
||||
|
||||
return DecodeImage(buf, CV_LOAD_IMAGE_UNCHANGED)
|
||||
}
|
||||
|
||||
/* From Image converts a go image.Image to an opencv.IplImage. */
|
||||
func FromImage(img image.Image) *IplImage {
|
||||
b := img.Bounds()
|
||||
model := color.NRGBAModel
|
||||
dst := CreateImage(
|
||||
b.Max.Y-b.Min.Y,
|
||||
b.Max.X-b.Min.X,
|
||||
IPL_DEPTH_8U, 4)
|
||||
|
||||
for y := b.Min.Y; y < b.Max.Y; y++ {
|
||||
for x := b.Min.X; x < b.Max.X; x++ {
|
||||
px := img.At(x, y)
|
||||
c := model.Convert(px).(color.NRGBA)
|
||||
|
||||
value := NewScalar(float64(c.B), float64(c.G), float64(c.R), float64(c.A))
|
||||
dst.Set2D(x, y, value)
|
||||
}
|
||||
}
|
||||
|
||||
return dst
|
||||
}
|
||||
|
||||
/* ToImage converts a opencv.IplImage to an go image.Image */
|
||||
func (img *IplImage) ToImage() image.Image {
|
||||
out := image.NewNRGBA(image.Rect(0, 0, img.Width(), img.Height()))
|
||||
if img.Depth() != IPL_DEPTH_8U {
|
||||
return nil // TODO return error
|
||||
}
|
||||
|
||||
for y := 0; y < img.Height(); y++ {
|
||||
for x := 0; x < img.Width(); x++ {
|
||||
s := img.Get2D(x, y).Val()
|
||||
b, g, r, a := s[2], s[1], s[0], s[3]
|
||||
|
||||
c := color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)}
|
||||
out.Set(x, y, c)
|
||||
}
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
|
@ -399,11 +399,11 @@ func SaveImage(filename string, image *IplImage, params int) int {
|
|||
}
|
||||
|
||||
/* decode image stored in the buffer */
|
||||
func DecodeImage(buf unsafe.Pointer, iscolor int) *IplImage {
|
||||
func DecodeImage(buf *Mat, iscolor int) *IplImage {
|
||||
rv := C.cvDecodeImage((*C.CvMat)(buf), C.int(iscolor))
|
||||
return (*IplImage)(rv)
|
||||
}
|
||||
func DecodeImageM(buf unsafe.Pointer, iscolor int) *Mat {
|
||||
func DecodeImageM(buf *Mat, iscolor int) *Mat {
|
||||
rv := C.cvDecodeImageM((*C.CvMat)(buf), C.int(iscolor))
|
||||
return (*Mat)(rv)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue