【OpenCV學習之路】(1)實現在圖像上畫對角線和分割之一

看到了 這位老哥 @冰不語 的文章
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)) 的區別



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章