日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式案例Show
[導讀]點擊上方藍字關(guān)注我哦~ 01 前言 最近筆者在一些項目上需要對圖像做些變換操作,這些操作opencv基本上都幫我們實現(xiàn)了,但是在linux系統(tǒng)和Android系統(tǒng)實現(xiàn)起來還是有些區(qū)別的,在這里和大家分享下。 02 知識點 由四對點計算透射變換 函數(shù)原型: CvMat* cvGetPe

點擊上方藍字關(guān)注我哦~

01

前言


最近筆者在一些項目上需要對圖像做些變換操作,這些操作opencv基本上都幫我們實現(xiàn)了,但是在linux系統(tǒng)和Android系統(tǒng)實現(xiàn)起來還是有些區(qū)別的,在這里和大家分享下。

02

知識點


由四對點計算透射變換

函數(shù)原型:

CvMat* cvGetPerspectiveTransform( const CvPoint2D32f*src, const CvPoint2D32f* dst, CvMat*map_matrix );

參數(shù)含義:

src:輸入圖像的四邊形頂點坐標。

dst:輸出圖像的相應的四邊形頂點坐標。

map_matrix:指向3×3輸出矩陣的指針。

函數(shù)cvGetPerspectiveTransform計算滿足以下關(guān)系的透射變換矩陣:

這里,dst(i)= (x'i,y'i),src(i)= (xi,yi),i = 0..3。

對圖像進行透視變換

函數(shù)原型:

void cvWarpPerspective( const CvArr* src, CvArr* dst,const CvMat* map_matrix, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) );

src:輸入圖像.

dst:輸出圖像.

map_matrix:3×3 變換矩陣

flags:插值方法和以下開關(guān)選項的組合:

·  CV_WARP_FILL_OUTLIERS- 填充所有縮小圖像的像素。如果部分象素落在輸入圖像的邊界外,那么它們的值設(shè)定為 fillval.

·  CV_WARP_INVERSE_MAP- 指定 matrix 是輸出圖像到輸入圖像的反變換,因此可以直接用來做象素插值。否則, 函數(shù)從 map_matrix 得到反變換。

fillval:用來填充邊界外面的值。


函數(shù) cvWarpPerspective 利用下面指定矩陣變換輸入圖像:

如果沒有指定 CV_WARP_INVERSE_MAP:

否則:

要變換稀疏矩陣,使用 cxcore 中的函數(shù) cvTransform。

03

樹莓派實現(xiàn)


#include<iostream>#include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>
using namespace std;using namespace cv;
int main() { Point2f Ceneter(640, 512);// 1-5;在圖片上確定5個矯正點 坐標參數(shù)可調(diào)整 圖片默認size;1280*1024 Point2f left_up(485, 510); Point2f right_up(840, 425); Point2f right_down(847, 510); Point2f left_down(487, 567); const Point2f src[4] = { left_up, right_up, right_down, left_down }; //6;4個坐標數(shù)組(上下左右4個坐標)
float half_H = 42; //圖片高度調(diào)整范圍 float half_W = 280; //圖片寬度調(diào)整范圍 float scale = 0.8; //調(diào)整系數(shù)
float new_half_H = half_H * scale;//同7 float new_half_W = half_W * scale;//同8
float shift_x =100;//rng.uniform(50.f, 100.f);//新坐標x軸調(diào)整參數(shù) float shift_y = -20; //新坐標y軸調(diào)整參數(shù)
Point2f left_upX(Ceneter.x + shift_x - new_half_W, Ceneter.y + shift_y - new_half_H);//14-17;生成上下左右4個新坐標 Point2f right_upX(Ceneter.x + shift_x + new_half_W, Ceneter.y + shift_y - new_half_H); Point2f right_downX(Ceneter.x + shift_x + new_half_W, Ceneter.y + shift_y + new_half_H); Point2f left_downX(Ceneter.x + shift_x - new_half_W, Ceneter.y + shift_y + new_half_H);
Mat perspectivemat;
const Point2f dst[4] = { left_upX, right_upX, right_downX, left_downX };//
Mat TransMat = getPerspectiveTransform(src, dst); Mat Transimg; //新圖片矩陣 //Shape shape(1, 3, 720, 1280); int Train_Channel_size_ = 3;//shape.C; Mat handimg = cv::imread("B.jpg"); //cv::Mat& handimg = cv::imread("./000001.jpg", -1); if (!handimg.data) { // return 0; } //std::vector<ResultBox> one_img_bboxes_target; Size img_size; //Get_Boxes_Info(image_path + ".xml", one_img_bboxes_target, img_size); Mat image_reclor; if (handimg.channels() == 3 && Train_Channel_size_ == 1) cvtColor(handimg, image_reclor, cv::COLOR_BGR2GRAY); else if (handimg.channels() == 4 && Train_Channel_size_ == 1) cvtColor(handimg, image_reclor, cv::COLOR_BGRA2GRAY); else if (handimg.channels() == 4 && Train_Channel_size_ == 3) cvtColor(handimg, image_reclor, cv::COLOR_BGRA2BGR); else if (handimg.channels() == 1 && Train_Channel_size_ == 3) cvtColor(handimg, image_reclor, cv::COLOR_GRAY2BGR); else image_reclor = handimg; cv::Mat img_resize; if (image_reclor.size() != cv::Size(1280, 720)) { resize(image_reclor, img_resize, cv::Size(1280, 720)); } else { img_resize = image_reclor; } warpPerspective(img_resize, Transimg, TransMat, img_resize.size()); imwrite("Transimg.jpg", Transimg); cv::waitKey(0); return 0; }

04

安卓端實現(xiàn)


private Point Ceneter = new Point(640, 512);private float half_H = 42;private float half_W = 280;private float scale = (float) 0.8;private float shift_x =100;private float shift_y = -20;private Mat TransMat;
private void init(){ Mat src_mat = new Mat(4,1,CvType.CV_32FC2); Mat dst_mat = new Mat(4,1,CvType.CV_32FC2);
src_mat.put(0,0, 485, 510, 840, 425, 847, 510, 487, 567); float new_half_H = half_H * scale; float new_half_W = half_W * scale; dst_mat.put(0,0, Ceneter.x + shift_x - new_half_W, Ceneter.y + shift_y - new_half_H, Ceneter.x + shift_x + new_half_W, Ceneter.y + shift_y - new_half_H, Ceneter.x + shift_x + new_half_W, Ceneter.y + shift_y + new_half_H, Ceneter.x + shift_x - new_half_W, Ceneter.y + shift_y + new_half_H); TransMat = Imgproc.getPerspectiveTransform(src_mat, dst_mat);}
private void prosessImg(Bitmap frame, String resultFileName){ Bitmap rgba = frame.copy(Bitmap.Config.ARGB_8888, true); Mat handimg = new Mat();// = imread(image_path, 1); Utils.bitmapToMat(rgba, handimg); int Train_Channel_size_ = 3;
Mat image_reclor = new Mat(); if (handimg.channels() == 3 && Train_Channel_size_ == 1) cvtColor(handimg, image_reclor, COLOR_BGR2GRAY); else if (handimg.channels() == 4 && Train_Channel_size_ == 1) cvtColor(handimg, image_reclor, COLOR_BGRA2GRAY); else if (handimg.channels() == 4 && Train_Channel_size_ == 3) cvtColor(handimg, image_reclor, COLOR_BGRA2BGR); else if (handimg.channels() == 1 && Train_Channel_size_ == 3) cvtColor(handimg, image_reclor, COLOR_GRAY2BGR); else image_reclor = handimg; Mat img_resize = new Mat(); Size size = new Size(1280, 720); if (image_reclor.size() != size) { Imgproc.resize(image_reclor, img_resize, size); } else { img_resize = image_reclor; } Mat Transimg = new Mat(); Imgproc.warpPerspective(img_resize, Transimg, TransMat, img_resize.size()); rgba = PhotoUtil.matToBitmap(Transimg); String resultPicName = resultFileName.substring(0, resultFileName.lastIndexOf(".txt")); resultPicName = resultPicName + "_res.jpg"; FileUtil.saveBitmap(new File(resultPicName),rgba); rgba.recycle(); rgba = null; }


05

結(jié)果


原圖

變化后圖像


/ The End /

掃碼關(guān)注我們

看更多嵌入式案例

喜歡本篇內(nèi)容請給我們點個在看

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉