半藏于画 2021-10-26 22:39 采纳率: 100%
浏览 26
已结题

opencv怎么将8UC3的彩色图像更改像素后存入更改后的像素到图像里

单通道的可以更改,Vec3b中用at只能修改当前像素并在当前显示,一存像素就还原了,网上找了很多方法,存不进去,求解!

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 Mat img=imread("D:/opencvm/openeye/wearhouse/tujiuhp.jpg");
     void Matin(Mat img)   
  {   
       int k3,k4,k5;
       Mat temp(img.rows,img.cols,CV_8UC3);
    Vec3b a;
    for(int i = 0; i <img.rows; i++)
    {
          
        //Vec3b* ptr=a.ptr<Vec3b>(i);
        
        
            
            
            a[0]=img.at<Vec3b>(i,j)[0];
            a[1]=img.at<Vec3b>(i,j)[1];
            a[2]=img.at<Vec3b>(i,j)[2];
            temp.at<Vec3b>(i,j) = a;
            cout <<(int)temp.at<Vec3b>(i,j)[0]<<"  "; 
            
        }
        
    }

  • 写回答

2条回答 默认 最新

  • 半藏于画 2021-10-29 22:32
    关注

    。。。没人解答,继续研究了2天,,发现Mat里面存的Vec3b数据只要一imwrite保存,再读取数据就会全乱,虽然乱的幅度不大,但是对于想精确提取的数据却是灾难。所以想了个折中的办法:
    Vec3b** Mat3Vec(Mat img)
    {
    uchar k4,k5,k6;int i,j;

    Vec3b **array = new Vec3b*[img.rows]; 
    

    // Vec<Vec3b, row,col> vi
    for (int i = 0; i<img.rows; i++)
    array[i] = new Vec3b[img.cols];
    for (int i = 0; i < img.rows; i++)
    {
    for (int j = 0; j < img.cols; j++)
    {
    //代码块为k4,k5,k6赋值
    array[i][j] ={k4,k5,k6};
    }
    }

    return array;
    

    }
    来实时储存Mat转化的数据,程序不停止数据一直在。
    另外顺便吐槽一下,CSDN现在人这么少吗?问问题都没人答就算了,阅读的也这么少~~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月6日
  • 已采纳回答 10月29日
  • 创建了问题 10月26日

悬赏问题

  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表