【发布时间】:2018-08-20 20:13:27
【问题描述】:
我开始玩gocv。我试图弄清楚一件简单的事情:如何从具有某种颜色背景的图像中剪切出一个对象。在这种情况下,对象是披萨,背景颜色是蓝色。
我使用InRange 函数(OpenCV 中的inRange)定义蓝色的上限和下限以创建蒙版,然后使用CopyToWithMask 函数(OpenCV 中的copyTo)将蒙版应用到原始图像。我希望结果是蓝色背景,上面切掉了比萨饼。
代码很简单:
package main
import (
"fmt"
"os"
"gocv.io/x/gocv"
)
func main() {
imgPath := "pizza.png"
// read in an image from filesystem
img := gocv.IMRead(imgPath, gocv.IMReadColor)
if img.Empty() {
fmt.Printf("Could not read image %s\n", imgPath)
os.Exit(1)
}
// Create a copy of an image
hsvImg := img.Clone()
// Convert BGR to HSV image
gocv.CvtColor(img, hsvImg, gocv.ColorBGRToHSV)
lowerBound := gocv.NewMatFromScalar(gocv.NewScalar(110.0, 100.0, 100.0, 0.0), gocv.MatTypeCV8U)
upperBound := gocv.NewMatFromScalar(gocv.NewScalar(130.0, 255.0, 255.0, 0.0), gocv.MatTypeCV8U)
// Blue mask
mask := gocv.NewMat()
gocv.InRange(hsvImg, lowerBound, upperBound, mask)
// maskedImg: output array that has the same size and type as the input arrays.
maskedImg := gocv.NewMatWithSize(hsvImg.Rows(), hsvImg.Cols(), gocv.MatTypeCV8U)
hsvImg.CopyToWithMask(maskedImg, mask)
// save the masked image
newImg := gocv.NewMat()
// Convert back to BGR before saving
gocv.CvtColor(maskedImg, newImg, gocv.ColorHSVToBGR)
gocv.IMWrite("no_pizza.jpeg", newImg)
}
但是,生成的图像基本上几乎是全黑的,除了一点点披萨边缘:
至于选择的蓝色上下界,我按照官方documentation中提到的指南:
blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
print(hsv_blue)
[[[120 255 255]]]
现在您将 [H-10, 100,100] 和 [H+10, 255, 255] 作为下限和 分别为上限。
我确定我错过了一些基本的东西,但无法弄清楚它是什么。
【问题讨论】: