看到了 這位老哥 @冰不語 的文章
OpenCV實踐之路——方形圖片對角線切割
同時寫代碼的時候也參考了這位老哥 @yqtaowhu 的文章
Opencv學習筆記(三)–圖像處理的基本操作
於是我也想自己嘗試一下把圖片畫一條對角線
在實現了畫一條左上角到右下角的對角線後,我又嘗試畫一條從右上角到左下角的對角線。
注意:此次實現是以正方形圖爲模版
Talk is cheap,show you my code;
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
int main()
{
Mat srcImage = imread("04.jpg",0);
//以下判斷把矩形兔轉換成正方形圖
if (srcImage.rows > srcImage.cols)
resize(srcImage, srcImage, Size(srcImage.cols, srcImage.cols));
else
resize(srcImage, srcImage, Size(srcImage.rows, srcImage.rows));
Mat dst1(srcImage.size(),CV_8UC1,Scalar::all(0)),dst2(srcImage.size(), CV_8UC1, Scalar::all(0));
imshow("origin1", srcImage);
for (int j = 0; j < srcImage.rows; j++)
{
for (int i = 0; i < srcImage.cols; i++)
{
if (i == j) srcImage.at<uchar>(j, i) = 0;
else if(j == (-i + srcImage.rows)) srcImage.at<uchar>(j, i) = 0;
else srcImage.at<uchar>(j, i) = srcImage.at<uchar>(j, i);
}
}
imshow("origin",srcImage);
waitKey(0);
return 0;
}
以下是代碼運行結果截圖:
然後其中有一點 個人頗爲不明的是在遍歷圖像像素的時候
for (int j = 0; j < srcImage.rows; j++)
{
for (int i = 0; i < srcImage.cols; i++)
{
if (i == j) srcImage.at<uchar>(Point(j, i)) = 0;//我的代碼那裏是 srcImage.at<uchar>(Point(j, i)) = 0;
else if(j == (-i +srcImage.rows)) srcImage.at<uchar>(Point(j, i)) = 0;
else srcImage.at<uchar>(Point(j, i)) = srcImage.at<uchar>(Point(j, i));
}
}
多了一個Point(j,i)這個有什麼用呢?因爲也不影響運行結果,百度了一下
看到 @giantchen2010 這位老哥的文章 OpenCV參考手冊之Mat類詳解(三)
我的理解是:
Mat::at 這個類有多個重載,所以有沒有Point它都能正確識別
然後就可以實現 把圖像分割的效果
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
int main()
{
Mat srcImage = imread("04.jpg",0);
//一下判斷把矩形兔轉換成正方形圖
if (srcImage.rows > srcImage.cols)
resize(srcImage, srcImage, Size(srcImage.cols, srcImage.cols));
else
resize(srcImage, srcImage, Size(srcImage.rows, srcImage.rows));
Mat dst0(srcImage.size(), CV_8UC1, Scalar::all(0)),dst1(srcImage.size(),CV_8UC1,Scalar::all(0)),dst2(srcImage.size(), CV_8UC1, Scalar::all(0));
imshow("原始圖像", srcImage);
for (int j = 0; j < srcImage.rows; j++)
{
for (int i = 0; i < srcImage.cols; i++)
{
if (i == j) dst0.at<uchar>(Point(j, i)) = 0;
else if(j == (-i +srcImage.rows)) dst0.at<uchar>(Point(j, i)) = 0;
else dst0.at<uchar>(Point(j, i)) = srcImage.at<uchar>(Point(j, i));
if (i >= j) dst1.at<uchar>(j, i) = srcImage.at<uchar>(j, i);
else
dst2.at<uchar>(j, i) = srcImage.at<uchar>(j, i);
}
}
imshow("對角線", dst0);
imshow("左上角", dst1);
imshow("右下角", dst2);
waitKey(0);
return 0;
}
運行效果:
而 @冰不語 在對原圖畫一條線的操作是用line函數實現的
步驟是:
1.用Point確定兩個點的座標
Point a = Point(0,0);
Point b = Point(srcImage.cols,srcImage.rows);//注意這裏代表(x,y)所以圖片的列纔是x,行是y
2.再用line函數連接這兩個點
line(srcImage, a, b, Scalar(255), 1);
就可以實現畫線的效果了。
下次再補充長方形的圖片,和彩色圖片。
修改時間:2018/5/12 17:19:24
注意!!!
其實.at< uchar>(j, i) 和.at< uchar>(Point(j, i)) 兩者還是有點區別的!!
詳情請看(你可以先看完整篇文章再來看這個區別):
對於.at(j, i) 和.at(Point(j, i)) 的區別