此程序显示包含图像的连续帧。
但是,如您所见,蠕虫图像具有白色背景。
但我已经删除了蠕虫图像的背景,因此当前的蠕虫图像背景是透明的。
我想透明地处理蠕虫图像的背景,并显示蠕虫图像不是灰色而是色彩鲜艳。
我尝试编辑成cvtColor(image,srcBGR,CV_BGR2BGRA),但是发生了错误。
这是代码。
#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;
}
答案 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)
进行阅读,然后拆分频道。
我们可以清楚地找到alpha channel
。
然后mask-operation
到blend
,我们会得到这个:
## 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";