单通道的可以更改,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天,,发现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现在人这么少吗?问问题都没人答就算了,阅读的也这么少~~
又搞了一天,因为我要做的是Mat->ptr-->更改ptr[0].ptr[1].ptr[2]的值,-->Mat的变化,且必须是彩色图,发现竟然没有能完成的手段!
在(i,j)的循环最里层完成并输出都是完美的,一储存更改得到的图像,一切回归原点。
有没有大神来棒棒我~