国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
如何解決opencv.js投影變換結(jié)果為空白的透明圖片問題
首頁 web前端 js教程 如何解決OpenCV.js投影變換後結(jié)果為空白透明圖片的問題?

如何解決OpenCV.js投影變換後結(jié)果為空白透明圖片的問題?

Apr 04, 2025 pm 03:45 PM
ai 解決方法 點擊事件

如何解決opencv.js投影變換結(jié)果為空白的透明圖片問題

在使用opencv.js進(jìn)行圖像處理時,有時候會遇到投影變換後圖像結(jié)果為空白的透明圖片的問題。以下是我遇到的問題以及解決方法。

我在處理圖像時,代碼能夠成功識別出文檔的四個坐標(biāo),但到了投影變換這一步,得到的結(jié)果總是空白的透明圖片,並且沒有報錯。以下是我使用的投影變換部分代碼:

 // 投影變換let srcquad = cv.matfromarray(4, 1, cv.cv_32fc2, points.flat());
let dstquad = cv.matfromarray(4, 1, cv.cv_32fc2, [0, 0, img.cols, 0, img.cols, img.rows, 0, img.rows]);
let transmtx = cv.getperspectivetransform(srcquad, dstquad);
let target = new cv.mat();
cv.warpperspective(img, target, transmtx, new cv.size(img.cols, img.rows));
// 顯示結(jié)果cv.imshow(canvas, target);

為了解決這個問題,我進(jìn)行了以下改進(jìn):

  1. 設(shè)置canvas 大小:在圖像加載完成後,即在imgelement.onload 函數(shù)中,設(shè)置canvas 的寬度和高度與圖像的尺寸一致。
  2. 添加錯誤處理:在圖像加載失敗時,即在imgelement.onerror 函數(shù)中,添加錯誤處理以捕獲圖像加載錯誤。

以下是改進(jìn)後的完整代碼:

 

    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>OpenCV.js Example</title>


    <script async src="https://docs.opencv.org/4.5.5/opencv.js" onload="onOpenCvReady();"></script>
    <canvas id="canvasOutput"></canvas>
    <script>
        function onOpenCvReady() {
            console.log("OpenCV.js加載完成.");
            processImage();
        }

        function sleep(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        }

        async function processImage() {
            await sleep(3000); // 等待3 秒let imageUrl = "../archives/111.jpg";
            let imgElement = new Image();
            imgElement.src = imageUrl;
            var img;

            // 加載圖像imgElement.onload = function() {
                try {
                    img = cv.imread(imgElement);
                    if (img.empty()) {
                        console.error("Image could not be read.");
                        return;
                    }

                    // 獲取canvas 元素並設(shè)置大小let canvas = document.getElementById(&#39;canvasOutput&#39;);
                    canvas.width = img.cols;
                    canvas.height = img.rows;

                    // 重置圖像大小let dsize = new cv.Size(img.cols, img.rows);
                    let dst = new cv.Mat();
                    cv.resize(img, dst, dsize, 0, 0, cv.INTER_AREA);

                    // 轉(zhuǎn)為灰度圖像console.log("轉(zhuǎn)換之前:", img);
                    let gray = new cv.Mat(); // 創(chuàng)建一個新的Mat 對象來存灰度圖像cv.cvtColor(dst, gray, cv.COLOR_BGR2GRAY); // 使用適當(dāng)?shù)霓D(zhuǎn)換console.log("轉(zhuǎn)換之後:", gray);

                    // 高斯濾波cv.GaussianBlur(gray, gray, new cv.Size(11, 11), 0, 0);
                    cv.imshow(canvas, gray);
                    cv.Canny(gray, gray, 20, 50, 3);

                    let contours = new cv.MatVector();
                    let hierarchy = new cv.Mat();
                    cv.findContours(gray, contours, hierarchy, cv.RETR_CCOMP, cv.CHAIN_APPROX_NONE);

                    let index = 0, maxArea = 0;
                    const area = img.cols * img.rows;
                    for (let i = 0; i < contours.size(); i) {
                        let tempArea = Math.abs(cv.contourArea(contours.get(i)));
                        if (tempArea > maxArea && tempArea > 0.3 * area) {
                            index = i;
                            maxArea = tempArea;
                        }
                    }

                    if (maxArea === 0) return;
                    const foundContour = contours.get(index);
                    const arcL = cv.arcLength(foundContour, true);
                    let approx = new cv.Mat();

                    // 逼近多邊形cv.approxPolyDP(foundContour, approx, 0.01 * arcL, true);

                    if (approx.total() === 4) {
                        let points = [];
                        const data32S = approx.data32S;
                        for (let i = 0, len = data32S.length / 2; i < len; i ) {
                            points[i] = {x: data32S[i * 2], y: data32S[i * 2 1]};
                        }
                        console.log("檢測到四邊形點:", points);

                        // 投影變換let srcQuad = cv.matFromArray(4, 1, cv.CV_32FC2, points.flat());
                        let dstQuad = cv.matFromArray(4, 1, cv.CV_32FC2, [0, 0, img.cols, 0, img.cols, img.rows, 0, img.rows]);
                        let transmtx = cv.getPerspectiveTransform(srcQuad, dstQuad);
                        let target = new cv.Mat();
                        cv.warpPerspective(img, target, transmtx, new cv.Size(img.cols, img.rows));

                        // 顯示結(jié)果cv.imshow(canvas, target);

                        // 創(chuàng)建一個臨時的canvas 元素let tempCanvas = document.createElement(&#39;canvas&#39;);
                        tempCanvas.width = target.cols;
                        tempCanvas.height = target.rows;
                        let tempCtx = tempCanvas.getContext(&#39;2d&#39;);

                        // 將cv.Mat 轉(zhuǎn)換為ImageData
                        let imageData = new ImageData(new Uint8ClampedArray(target.data), target.cols, target.rows);

                        // 將ImageData 繪製到臨時的canvas 上tempCtx.putImageData(imageData, 0, 0);

                        // 將canvas 生成Blob 對象tempCanvas.toBlob((blob) => {
                            // 創(chuàng)建一個URL 對象let url = URL.createObjectURL(blob);
                            // 創(chuàng)建一個a 元素並設(shè)置其屬性let a = document.createElement(&#39;a&#39;);
                            a.href = url;
                            a.download = &#39;processed_image.png&#39;; // 設(shè)置下載文件的名稱// 將a 元素添加到body 中document.body.appendChild(a);
                            // 觸發(fā)點擊事件以開始下載a.click();
                            // 下載完成後移除a 元素document.body.removeChild(a);
                            // 釋放URL 對象URL.revokeObjectURL(url);
                        }, &#39;image/png&#39;);

                        // 釋放內(nèi)存target.delete(); // 在這裡釋放target,否則會造成內(nèi)存洩露}

                    // 釋放內(nèi)存img.delete();
                    dst.delete();
                    gray.delete(); // 釋放灰度圖像Mat
                    contours.delete();
                    hierarchy.delete();
                    approx.delete();
                    foundContour.delete();
                } catch (err) {
                    console.error("圖像處理出現(xiàn)錯誤:", err);
                }
            }

            imgElement.onerror = function() {
                console.error("Image could not be loaded.");
            };
        }
    </script>

通過上述改進(jìn),我成功解決了投影變換後結(jié)果為空白透明圖片的問題。希望這些改進(jìn)對大家也有幫助。

以上是如何解決OpenCV.js投影變換後結(jié)果為空白透明圖片的問題?的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

鏈上資金流向大曝光:聰明錢正在下注哪些新代幣? 鏈上資金流向大曝光:聰明錢正在下注哪些新代幣? Jul 16, 2025 am 10:15 AM

普通投資者可通過追蹤“聰明錢”發(fā)現(xiàn)潛力代幣,其為高盈利地址,關(guān)注其動向能提供領(lǐng)先指標(biāo)。 1.使用Nansen、Arkham Intelligence等工具分析鏈上數(shù)據(jù),查看聰明錢的買入與持倉情況;2.通過Dune Analytics獲取社區(qū)創(chuàng)建的儀表板,監(jiān)測資金流向;3.關(guān)注Lookonchain等平臺獲取實時情報。近期聰明錢正佈局再質(zhì)押與LRT賽道、DePIN項目、模塊化生態(tài)及RWA協(xié)議,如某LRT協(xié)議獲大量早期存款,某DePIN項目被持續(xù)積累,某遊戲公鏈獲產(chǎn)業(yè)金庫支持,某RWA協(xié)議吸引機(jī)構(gòu)入場

比特幣、Chainlink、RWA共振上漲:加密市場進(jìn)入機(jī)構(gòu)邏輯? 比特幣、Chainlink、RWA共振上漲:加密市場進(jìn)入機(jī)構(gòu)邏輯? Jul 16, 2025 am 10:03 AM

比特幣、Chainlink與RWA的聯(lián)動上漲標(biāo)誌著加密市場正轉(zhuǎn)向機(jī)構(gòu)敘事主導(dǎo)。比特幣作為機(jī)構(gòu)配置的宏觀對沖資產(chǎn),為市場提供穩(wěn)定基礎(chǔ);Chainlink通過預(yù)言機(jī)和跨鏈技術(shù)成為連接現(xiàn)實與數(shù)字世界的關(guān)鍵橋樑;RWA則為傳統(tǒng)資本入場提供合規(guī)路徑。三者共同構(gòu)建了機(jī)構(gòu)入場的完整邏輯閉環(huán):1)配置BTC穩(wěn)定資產(chǎn)負(fù)債表;2)通過RWA拓展鏈上資產(chǎn)管理;3)依賴Chainlink建設(shè)底層基礎(chǔ)設(shè)施,預(yù)示市場進(jìn)入由真實需求驅(qū)動的新階段。

加密貨幣行情網(wǎng)站有哪些 虛擬貨幣行情網(wǎng)址推薦 加密貨幣行情網(wǎng)站有哪些 虛擬貨幣行情網(wǎng)址推薦 Jul 17, 2025 pm 09:30 PM

在瞬息萬變的虛擬貨幣市場中,及時準(zhǔn)確的市場行情數(shù)據(jù)至關(guān)重要。免費行情網(wǎng)站為投資者提供了一個便捷的途徑,能夠?qū)崟r了解各種數(shù)字資產(chǎn)的價格波動、交易量、市值變化等關(guān)鍵信息。這些平臺通常聚合了來自多個交易所的數(shù)據(jù),用戶無需在各個交易所之間切換,即可獲得全面的市場概覽,這對於普通投資者而言,極大地降低了獲取信息的門檻。

穩(wěn)定幣怎麼交易_新手買入賣出全流程圖解 穩(wěn)定幣怎麼交易_新手買入賣出全流程圖解 Jul 18, 2025 am 06:00 AM

穩(wěn)定幣交易流程包括註冊交易所、完成認(rèn)證、購買或賣出步驟。首先選擇可信交易所如Binance、OKX等,其次完成KYC身份認(rèn)證,隨後通過法幣充值或OTC交易買入穩(wěn)定幣,也可將穩(wěn)定幣劃轉(zhuǎn)至資金賬戶後通過P2P交易賣出並提現(xiàn)至銀行卡或支付寶,操作時需注意選擇受監(jiān)管平臺、確認(rèn)交易安全及手續(xù)費問題。

Filecoin、Render、AI存儲預(yù)售升溫:Web3基礎(chǔ)設(shè)施爆點將至? Filecoin、Render、AI存儲預(yù)售升溫:Web3基礎(chǔ)設(shè)施爆點將至? Jul 16, 2025 am 09:51 AM

是的,Web3基礎(chǔ)設(shè)施正因AI需求升溫而迎來爆發(fā)預(yù)期。 Filecoin通過“Compute over Data”計劃整合計算能力,支持AI數(shù)據(jù)處理與訓(xùn)練;Render Network提供分佈式GPU算力,服務(wù)AIGC圖形渲染;Arweave以永久存儲特性支撐AI模型權(quán)重和數(shù)據(jù)溯源;三者結(jié)合技術(shù)升級與生態(tài)資本推動,正從邊緣走向AI底層核心。

狗狗幣、Pepe、Brett橫掃模因賽道:投機(jī)還是新敘事? 狗狗幣、Pepe、Brett橫掃模因賽道:投機(jī)還是新敘事? Jul 16, 2025 am 09:57 AM

狗狗幣、Pepe、Brett正引領(lǐng)模因幣熱潮,Dogecoin(DOGE)作為鼻祖穩(wěn)居市值榜首,Pepe(PEPE)憑藉社群梗文化實現(xiàn)數(shù)百倍漲幅,Brett(BRETT)作為Base鏈新星以獨特視覺風(fēng)格迅速走紅;三者分別於2013年、2023年、2024年發(fā)行,技術(shù)上Dogecoin基於Litecoin,Pepe與Brett為ERC-20代幣且後者依托Base鏈提升效率,社區(qū)方面DOGE推特粉絲超300萬,PepeReddit活躍度領(lǐng)先,Brett在Base鏈熱度攀升,上線平臺方面DOGE已登陸

幣an交易所交易所官網(wǎng)中文App下載.排名前十的.cc 幣an交易所交易所官網(wǎng)中文App下載.排名前十的.cc Jul 17, 2025 pm 07:00 PM

幣安是由加拿大華裔工程師趙長鵬創(chuàng)建的國際知名區(qū)塊鏈數(shù)字資產(chǎn)交易平臺,提供數(shù)字貨幣交易、區(qū)塊鏈教育、項目孵化等多元化服務(wù)。

山寨幣全線反彈:新一輪牛市已經(jīng)啟動?是否值得入場? 山寨幣全線反彈:新一輪牛市已經(jīng)啟動?是否值得入場? Jul 16, 2025 am 09:48 AM

是的,山寨幣反彈可能預(yù)示新一輪牛市醞釀階段開啟,但入場需謹(jǐn)慎。 1. 市場情緒回暖,幣安、歐易、火幣等平臺山寨幣交易量激增,資金流入AI、Layer2、GameFi板塊;2. 山寨反彈呈現(xiàn)牛市初期特徵,比特幣企穩(wěn)、熱點輪動加快、新項目頻繁上線;3. 是否入場需根據(jù)投資策略判斷:長期投資者可逐步建倉龍頭項目,短線交易者可關(guān)注活躍幣種波段機(jī)會,小倉位嘗試新幣需避免追高;4. 後續(xù)需觀察比特幣能否突破前高、三大平臺資金流向、美聯(lián)儲政策及鏈上活躍度等關(guān)鍵指標(biāo)以判斷行情持續(xù)性。

See all articles