关于图像处理,我有两个问题。我想将两个图像相乘以仅获得前景图像。
第一个问题是,当ı运行所属代码但结果不佳时(图像链接为https://drive.google.com/file/d/0B5b8Wm-4Dlb6dkljSlowV3k3TE0/view?usp=sharing)。如果我写i,则不会扫描所有图片像素。如果ıwrtiei
另一个问题是,当此函数循环运行时(循环是每秒运行10次的ROS循环),程序将终止。我不明白为什么?
Mat depthSubtraction()
{
typedef ushort imgType;
Mat sub=imread("/home/aylin/Desktop/sub.png");
Mat dep=imread("/home/aylin/Desktop/depth.png");
Mat a,b;
imgType* m_a = NULL;
imgType* m_b = NULL;
imgType* m_c = NULL;
int picWidth = dep.cols; //picture width
int picHeight = dep.rows; //picture height
Mat outputImg(picHeight,picWidth, dep.type()); //initialize the output image
//memset(outputImg.data, 0, picWidth * picHeight*sizeof(imgType));//set the output image to zeros
//outputImg=zeros(picHeight, picWidth, dep.type());
m_a=(imgType*)sub.data;
m_b=(imgType*)dep.data;
m_c=(imgType*)outputImg.data;
for(int i=0;i<picWidth*picHeight ;i++,m_a++,m_b++,m_c++)
{
if(*m_a<2)
{
*m_a=0;
*m_c = (*m_a)*(*m_b);
*m_b=0;
}
else
{
*m_a=1;
*m_c = (*m_a)*(*m_b);
*m_b=0;
}
cout<<*m_c<<" "<<*m_a<<endl;
}
cvtColor(outputImg, b, CV_BGR2GRAY);
imshow("aaaa",b);
imwrite("/home/aylin/Desktop/newww.png",b);
waitKey();
}
int main(int argc, char **argv)
{
/*
init(argc, argv, "Aylin_node");
Subscribe_Depth sd;
Rate spin_rate(10);
while( ok() ) {
spinOnce();
spin_rate.sleep();
}
*/
depthSubtraction();
return 0;
}
最佳答案
您的imgType应该是uchar而不是ushort。
另外,由于默认情况下imread读取彩色图像,因此for循环应运行picWidth * picHeight * 3次。
除此之外,我看不到代码有任何问题,但是,如果我尝试实现相同的功能,则可以这样编写:
Mat src = imead("image.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat mask = imread("mask.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC1);
src.copyTo(dst, mask);
关于opencv - 不扫描像素(c++和opencv),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27661112/