OpenCV C++中使用img.at设置单个像素颜色失败求助
问题解决:OpenCV设置单个像素颜色
你的代码编译通过但看不到图像,核心问题是img.at的模板参数用错了——CV_8UC3类型的Mat,每个像素对应的是3个无符号字节的向量(cv::Vec3b),而非cv::Scalar。
正确代码示例(设置全图绿色)
int main( void ){ cv::Mat img(400,400, CV_8UC3); // 先初始化图像为黑色,避免内存随机值干扰显示 img = cv::Scalar(0, 0, 0); for(int i=0; i < 400; ++i){ for(int j=0; j < 400; ++j){ // 使用cv::Vec3b作为at的模板参数 img.at<cv::Vec3b>(i, j) = cv::Vec3b(0, 255, 0); } } cv::imshow("Tetris", img); cv::moveWindow("Tetris", 400, 400); cv::waitKey(0); }
红绿蓝像素的设置方式
OpenCV默认采用BGR通道顺序,对应颜色的写法如下:
- 蓝色:
cv::Vec3b(255, 0, 0)或赋值时用cv::Scalar(255, 0, 0) - 绿色:
cv::Vec3b(0, 255, 0)或cv::Scalar(0, 255, 0) - 红色:
cv::Vec3b(0, 0, 255)或cv::Scalar(0, 0, 255)
另一种直接访问像素的方式
如果不想用at方法,也可以直接操作Mat的内存:
// 针对(i,j)位置的像素,分别设置B、G、R通道 img.data[i * img.step + j * 3 + 0] = 255; // B通道 img.data[i * img.step + j * 3 + 1] = 0; // G通道 img.data[i * img.step + j * 3 + 2] = 0; // R通道
内容的提问来源于stack exchange,提问作者flori10
相关产品推荐
相关产品推荐

