使用OpenCV(CodeBlocks)设置图像全黑失败求助
问题分析与解决方案
看起来你遇到的问题是误将彩色三通道图像当作单通道灰度图处理了!
你的代码里用src.at<uchar>(j,i) = 0只修改了图像的单个通道值,但如果你的原始图像是彩色的(OpenCV默认是BGR三通道),另外两个通道的像素值还保留着原始数据,所以最终显示出来的不是全黑,而是只有一个通道为0的彩色条纹图——这和你描述的图像效果完全匹配。而你打印像素值时可能只输出了被修改的那个通道,所以看起来全是0,但实际另外两个通道并没有被修改。
解决方法有两种,推荐第二种更高效:
方法1:针对三通道图像修改每个通道的像素
如果确定是彩色三通道图像,可以用Vec3b来访问每个像素的三个通道,把它们都设为0:
for(int i=0; i<src.cols; i++){ for(int j=0; j<src.rows; j++){ // 直接赋值三通道全为0 src.at<Vec3b>(j,i) = Vec3b(0, 0, 0); // 或者分别设置每个通道 // src.at<Vec3b>(j,i)[0] = 0; // B通道 // src.at<Vec3b>(j,i)[1] = 0; // G通道 // src.at<Vec3b>(j,i)[2] = 0; // R通道 } }
方法2:直接生成全黑图像(更高效,无需循环)
OpenCV提供了更简便的方式,不用手动循环就能把整个图像置黑,尤其适合大图像:
// 创建和原图像尺寸、类型一致的全黑图像 src = Mat::zeros(src.size(), src.type());
额外建议
你可以先打印图像的通道数确认一下:
cout << "图像通道数:" << src.channels() << endl;
如果输出是3,就说明是彩色三通道图像;如果是1,那才是单通道灰度图,这时候你的原代码才会生效。
内容的提问来源于stack exchange,提问作者Shrey Tiwari
相关产品推荐
相关产品推荐

