opencv(mat與qimage 的互轉)及簡單的影像處理
- 一、opencv庫檔案
- 二、使用方式(Qt)
- 三、QImage 轉 Mat (不太全,多多指教)
- 四、Mat轉 QImage
- 五、一些簡單的影像處理操作
- 1、圖片的濾色
- 2、圖片的反色
- 3、影像的提色
一、opencv庫檔案
編譯好的opencv 庫,
點擊這里進行下載
二、使用方式(Qt)
把上面下載的opencv.zip 解壓出來的include和lib 檔案夾放到工程檔案夾里面,并在pro 檔案中添加以下代碼,即可使用
INCLUDEPATH +=$$PWD\include
INCLUDEPATH +=$$PWD\include\opencv
INCLUDEPATH +=$$PWD\include\opencv2
LIBS +=$$PWD\lib/libopencv_*.a
三、QImage 轉 Mat (不太全,多多指教)
通過判斷QImage 的型別 在呼叫Mat 的建構式進行轉換,代碼都有進行注釋
代碼如下(示例):
cv::Mat ImageHandle::QImage2Mat(QImage image)
{
cv::Mat mat; //創建一個mat物件來接收
switch (image.format()) //QImage 的一個庫函式 可以回傳圖片的型別
{
case QImage::Format_ARGB32_Premultiplied: //RGB32 為四通道的所以在呼叫mat建構式需要轉換成四通道的mat型別(CV_8UC4)
mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
break;
case QImage::Format_RGB888: //RGB888 即RGB24 三通道八位的圖片 所以轉成三通道的mat(CV_8UC4)
mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
//因為Qimage 是RGB 通道 而 Mat 為 BGR 通道 所以需要使用cvtcolor進行轉換,不然圖片通道會顛倒
cv::cvtColor(mat, mat,cv::COLOR_RGB2BGR);
break;
case QImage::Format_Indexed8: //Indexed8 為單通道的圖片 所以在轉換成mat 也是單通道(CV_8UC1)
mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
break;
}
return mat;
}
四、Mat轉 QImage
跟上面一樣也是通過判斷mat的通道 呼叫QImage的建構式來進行轉換
QImage ImageHandle::Mat2QImage(cv::Mat mat)
{
if(mat.type() == CV_8UC1)
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
//轉換為qimage 單通道顏色值
image.setColorCount(256);
for(int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));
}
uchar *pSrc = mat.data;
for(int row = 0; row < mat.rows; row ++)
{
uchar *pDest = image.scanLine(row);
memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;
}
return image;
}
else if(mat.type() == CV_8UC3)
{
QImage image((const uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
return image.rgbSwapped();
}
else if(mat.type() == CV_8UC4)
{
const uchar *pSrc = (const uchar*)mat.data;
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
return image;
}
else
{
return QImage();
}
}
五、一些簡單的影像處理操作
1、圖片的濾色
通過mat的寬高來訪問圖片的所有像素點 并洗掉對應的顏色
QImage ImageHandle::ImageColorDelete(QImage &image, int flag)
{
cv::Mat mat = this->QImage2Mat(image);
cv::Mat dst = cv::Mat::zeros(mat.size(),mat.type());
int chl = mat.channels();
//遍歷像素點 濾除每個像素點所對應的顏色值,從而達到濾色的效果
for(int row=0;row<mat.rows;row++)
{
for(int col=0;col<mat.cols;col++)
{
if(chl == 3)
{
switch (flag)
{
case BLUE:
dst.at<cv::Vec3b>(row,col)[0] = 0;
dst.at<cv::Vec3b>(row,col)[1] = mat.at<cv::Vec3b>(row,col)[1];
dst.at<cv::Vec3b>(row,col)[2] = mat.at<cv::Vec3b>(row,col)[2];
break;
case GREEN:
dst.at<cv::Vec3b>(row,col)[0] = mat.at<cv::Vec3b>(row,col)[0];
dst.at<cv::Vec3b>(row,col)[1] = 0;
dst.at<cv::Vec3b>(row,col)[2] = mat.at<cv::Vec3b>(row,col)[2];
break;
case RED:
dst.at<cv::Vec3b>(row,col)[0] = mat.at<cv::Vec3b>(row,col)[0];
dst.at<cv::Vec3b>(row,col)[1] = mat.at<cv::Vec3b>(row,col)[1];
dst.at<cv::Vec3b>(row,col)[2] = 0;
break;
}
}
}
}
return this->Mat2QImage(dst);
}
2、圖片的反色
操作每個像素點,每個像素點的像素進行取反得到反色效果
QImage ImageHandle::ImageContraryColor(QImage &image)
{
cv::Mat mat = this->QImage2Mat(image);
cv::Mat dst = cv::Mat::zeros(mat.size(),mat.type());
int chl = mat.channels();
//操作每個像素點,每個像素點的像素進行取反得到反色效果
for(int row=0;row<mat.rows;row++)
{
for(int col=0;col<mat.cols;col++)
{
if(chl == 3)
{
dst.at<cv::Vec3b>(row,col)[0] = 255 - mat.at<cv::Vec3b>(row,col)[0];
dst.at<cv::Vec3b>(row,col)[1] = 255 - mat.at<cv::Vec3b>(row,col)[1];
dst.at<cv::Vec3b>(row,col)[2] = 255 - mat.at<cv::Vec3b>(row,col)[2];
}
}
}
return this->Mat2QImage(dst);
}
3、影像的提色
遍歷像素點 提取所對應的顏色
cv::Mat mat = this->QImage2Mat(image);
cv::Mat dst = cv::Mat::zeros(mat.size(),mat.type());
int chl = mat.channels();
//遍歷像素點 提取所對應的顏色
for(int row=0;row<mat.rows;row++)
{
for(int col=0;col<mat.cols;col++)
{
if(chl == 3)
{
switch (flag)
{
case BLUE:
dst.at<cv::Vec3b>(row,col)[0] = mat.at<cv::Vec3b>(row,col)[0];
dst.at<cv::Vec3b>(row,col)[1] = 0;
dst.at<cv::Vec3b>(row,col)[2] = 0;
break;
case GREEN:
dst.at<cv::Vec3b>(row,col)[0] = 0;
dst.at<cv::Vec3b>(row,col)[1] = mat.at<cv::Vec3b>(row,col)[1];
dst.at<cv::Vec3b>(row,col)[2] = 0;
break;
case RED:
dst.at<cv::Vec3b>(row,col)[0] =0;
dst.at<cv::Vec3b>(row,col)[1] = 0;
dst.at<cv::Vec3b>(row,col)[2] = mat.at<cv::Vec3b>(row,col)[2];
break;
}
}
}
}
return this->Mat2QImage(dst);
剛開始主要還是記錄一下自己實作的功能,后面還會進行更新opencv 的影像處理部分
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337839.html
標籤:其他
上一篇:將numpy型別影像轉化為tensor資料顯示《pytorch學習篇》
下一篇:Ubuntu opencv
