如何使用c ++清除OpenCV中的白色背景?

时间:2017-11-20 07:27:49

标签: c++ image opencv

Result screen image

此程序显示包含图像的连续帧。

但是,如您所见,蠕虫图像具有白色背景。

但我已经删除了蠕虫图像的背景,因此当前的蠕虫图像背景是透明的。

我想透明地处理蠕虫图像的背景,并显示蠕虫图像不是灰色而是色彩鲜艳。

我尝试编辑成cvtColor(image,srcBGR,CV_BGR2BGRA),但是发生了错误。

worm image

这是代码。

#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
#include<vector>

using namespace std;
using namespace cv;

int main(){
    VideoCapture cap;
    cap.open(0);

    if(!cap.isOpened()){
        cerr << "Error opening the webcam!" << endl;
        return -1;
    }
    Mat image = imread("images/worm.png", 0);
    cv::resize(image,image,Size(70, 120));  
    Mat frame;
    while(1){
        cap >> frame; 
        Mat newFrame = frame.clone();
        int cx = (newFrame.cols - 70) / 2;
        if (!image.empty()) {
            // Get a BGR version of the face, since the output is BGR color
            Mat srcBGR = Mat(image.size(), CV_8UC3);
            cvtColor(image, srcBGR, CV_GRAY2BGR);
            // Get the destination ROI (and make sure it is within the image)
            Rect dstRC = Rect(cx, newFrame.rows/2, 70, 120);
            Mat dstROI = newFrame(dstRC);
            // Copy the pixels from src to dst.
            srcBGR.copyTo(dstROI);  
        }
        imshow("frame", newFrame);
        char key = (char) waitKey(30);
        // Exit this loop on escape:
        if(key == 27)
            break;
    }   

    return 0;
}

3 个答案:

答案 0 :(得分:1)

使用

读取图像
Mat image = imread("images/worm.png", 0);

将丢弃透明度信息并将其加载为RGB图像。相反,您可以使用

Mat image = imread("images/worm.png", cv2.IMREAD_UNCHANGED);

由于您在复制之前将捕获的图像转换为BGRA图像,因此其余代码现在可以正常工作。

答案 1 :(得分:1)

我尝试用Python演示它。

正如预览答案所述,cv2.imread(fname, 0)将丢弃透明度信息,即alpha channel

要保留alpha channel,请使用cv2.imread(fname, -1)或等于cv2.imread(fname, cv2.IMREAD_UNCHANGED)进行阅读,然后拆分频道。

enter image description here

我们可以清楚地找到alpha channel

然后mask-operationblend,我们会得到这个:

enter image description here

## read the images
## 读图(0:BGR, -1:保持不变)
wali = cv2.imread("wali.png")
worm = cv2.imread("worm.png", -1)

## split and merge channels
## 通道分离与合并 
w,h = worm.shape[:2]
b,g,r,a = cv2.split(worm)
mask = np.dstack((a,a,a))
worm = np.dstack((b,g,r))

## mask operation
## 掩模操作 
canvas = wali[100:100+h, 200:200+w]
imask = mask>0
canvas[imask] = worm[imask]

## display
## 显示 
cv2.imshow("wali", wali)
cv2.waitKey()

答案 2 :(得分:0)

试试这个:

my @IDS = "ID";